使用linq lambda表达式的查询列表

时间:2013-06-26 20:47:01

标签: c# linq

我如何获得县名单中的参与者?我得到了各县的县,然后我希望所有参与者都拥有县名单中的CountyOfParticipationId。

if (collaborationId != null)
{
    var counties = (from c in db.CountyCollaborations
                    where c.CollaborationId == collaborationId
                    select c).ToList();
    participants = participants.Where(p => p.CountyOfParticipationId in counties);


}

4 个答案:

答案 0 :(得分:3)

participants = participants
.Where(p => counties.Any(c=> c.CountyId == p.CountyOfParticipationId) )

participants.Where(p => p.County.CollaborationId == collaborationId)
如果您已正确设置关系,

也应该有效

答案 1 :(得分:3)

.Where(p => counties.Contains(p.CountyOfParticipationId))

现在如果有很多数据要小心这个的复杂性。列表中的Contains是O(n),因此整体算法为O(n * m),其中n为m,m为参与者数和县数。

为了获得更好的性能,您可以将县存储在HashSet中,该HashSet包含O(1),意味着整体为O(n)。

当然,如果县的数量很少,那真的没关系。

编辑:注意您的列表不包含ID,而是包含完整对象。要使上述代码正常工作,您还需要将linq查询从select c更改为select c.Id或类似的内容(不知道字段的名称)。

答案 2 :(得分:1)

在某些情况下这可能会更好,因为如果linq方法将表达式转换为场景后面的sql,则不必单独存储县。

participants = (from p in participants 
                  join c in 
                      db.CountyCollaborations
                          .Where(cty=>cty.CollaborationId == collaborationId)
                      on p.CountyOfParticipationId equals c.CountyId
                select p);

答案 3 :(得分:0)

假设每个县都有一个CountyId:

participants = participants.Where( p => 
  counties.Select(c=> c.CountyId ).Contains( p.CountyOfParticipationId) );