Linq:计算子列表在另一个列表中显示的次数

时间:2016-05-17 08:41:38

标签: linq linq-to-sql contains

我想必须有一个简单的方法,但找不到它。我想检查项目列表是否(完全或部分)出现在另一个列表中。

例如:假设我有一个部门的人员作为清单1.然后我有一个体育清单,列出了该运动的参与者名单。

现在我想知道,一个部门的所有人都会参加多少项运动。

(我知道从标准化角度看一些表格可能没有意义,但这种方式比尝试解释我的真实表格更容易)

所以我有这样的事情:

var peopleInDepartment = from d in Department_Members
                         group d by r.DepartmentID into g
                         select new
                         {
                            DepartmentID = g.Key,
                            TeamMembers = g.Select(r => d.PersonID).ToList()
              };

var peopleInTeam = from s in Sports
                   select new 
                   {
                      SportID = s.SportID,
                      PeopleInSport = s.Participants.Select(x => x.PersonID),
                      NoOfMatches = peopleInDepartment.Contains(s.Participants.Select(x => x.PersonID)).Count()
           };

这里的错误是peopleInDepartment不包含'Contains'的定义。我想我只需要一个新的角度来看待它。

作为最终结果,我想打印:

部门1:该部门参加3项运动

部门2:该部门参加0体育

1 个答案:

答案 0 :(得分:1)

从预期结果判断,您应该像第一个查询一样将查询基于Department表。也许只是在第一个查询中包含运动计数,如下所示:

var peopleInDepartment = 
        from d in Department_Members
        group d by r.DepartmentID into g
        select new
        {
            DepartmentID = g.Key,
            TeamMembers = g.Select(r => d.PersonID).ToList(),
            NumberOfSports = Sports.Count(s => s.Participants
                                                .Any(p => g.Select(r => r.PersonID)
                                                           .Contains(p.PersonID)
                                                )
                                    )
        };

NumberOfSports应包含体育计数,其中任何参与者都被列为当前部门的成员(g.Select(r => r.PersonID).Contains(p.PersonID)))。