分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Jobje325

使用LINQ对子列表中有条件的元素进行计数 - Count elements with a condition in a sublist with linq

  •  0
  • Jobje325  · 技术社区  · 1 周前

    我试图从一个对象列表中获取一些值,这些对象本身有一个列表,但我正努力通过LINQ查询来实现这一点。我想向用户显示他们没有响应的事件数量。

    我有一个事件列表,每个事件都有一个事件用户列表,这些事件用户有一个Boolean HasResponsed和一个用户ID。我想检索某些用户尚未响应的事件量。

    为了简单起见,我省略了在LINQ查询中不需要的对象属性。

    事件类:

        public class Event
        {
            public List<EventUser> EventUsers { get; set; }
        }
    

    事件用户类:

        public class EventUser
        {
            public int EventId { get; set; }
            public Event Event { get; set; }
            public long UserId { get; set; }
            public User User { get; set; }
    
            public bool HasResponded { get; set; }
        }
    

    我的LINQ查询应该是这样的,但是我不能让它工作:

    _eventManager.QueryEvents().Where(x => x.StartTime > DateTime.Today && x.EventUsers.Select(z => z.UserId == userId && z.HasResponded)).Count()

    如何创建此LINQ查询?非常感谢您的帮助!

    3 回复  |  直到 1 周前
        1
  •  0
  •   Mustapha Larhrouch Dogu Arslan    1 周前

    类似这样的事情(警告不是编译它,但你得到了这个想法)

    _eventManager.QueryEvents().Where(x => x.StartTime > DateTime.Today)
                               .SelectMany(x => x.EventUsers)
                               .Count(z => z.UserId == userId && !z.HasResponded)
    
        2
  •  0
  •   Fabjan    1 周前

    基于我们掌握的非常有限的信息,我假设您希望获得今天发生的事件以及事件用户包含至少一个ID等于变量“user i d”的用户的queryevents数量-如果这是正确的,那么查询将是:

    var count = _eventManager.QueryEvents()
                             .Where(x => x.StartTime > DateTime.Today
                                && x.EventUsers.Any(z => z.UserId == userId && z.HasResponded))
                             .Count();
    
        3
  •  0
  •   jdweng    1 周前

    需要使用selectmany:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                EventManager _eventManger = new EventManager();
    
                var results = _eventManger.events.SelectMany(x => x.EventUsers.Select(y => y))
                    .GroupBy(x => x.UserId)
                    .Select(x => new { UserId = x.First().UserId, count = x.Where(y => y.HasResponded == false).Count() })
                    .ToList();
    
            }
        }
        public class EventManager
        {
            public List<Event> events { get; set; }
        }
        public class EventUser
        {
            public int EventId { get; set; }
            public Event Event { get; set; }
            public long UserId { get; set; }
            public User User { get; set; }
    
            public bool HasResponded { get; set; }
        }
        public class Event
        {
            public List<EventUser> EventUsers { get; set; }
        }
        public class User
        {
            public List<EventUser> EventUsers { get; set; }
        }
    }