为什么这两个linq查询返回不同数量的结果?

时间:2013-11-19 00:22:54

标签: c# .net performance linq

在我使用的Web应用程序中,我发现了一段缓慢的代码,我想加快一点。原始代码如下:

foreach (Guid g in SecondaryCustomersIds)
{
    var Customer = (from d in Db.CustomerRelationships

                    join c in Db.Customers on
                    d.PrimaryCustomerId equals c.CustomerId

                    where c.IsPrimary == true && d.SecondaryCustomerId == g
                    select c).Distinct().SingleOrDefault();
   //Add this customer to a List<>
}

我认为将所有内容加载到单个查询中可能会更快,因此我尝试将其重写为以下查询:

var Customers = (from d in Db.CustomerRelationships

                 join c in Db.Customers on
                 d.PrimaryCustomerId equals c.CustomerId

                 where c.IsPrimary == true && SecondaryCustomersIds.Contains(d.SecondaryCustomerId)
                 select c).Distinct();

哪个确实更快,但现在新查询返回的记录少于第一个。在我看来,这两个代码块正在做同样的事情,应该返回相同数量的记录。任何人都可以看到为什么他们不会?我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

第一个查询可能会将空对象添加到列表中(SingleOrDefault将返回该类型的默认值,如果找不到匹配的实体,则返回null )。因此,对于没有匹配关系的每个客户,您可以向List<>,添加一个空对象,这会增加计数。

答案 1 :(得分:0)

在您的第一个场景中,您的最终List<Customers>是否有重复项?

您正在调用Distinct,但也会循环播放,这意味着您没有对整个集合执行Distinct

您的第二个示例是在整个集合上调用Distinct