在我使用的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();
哪个确实更快,但现在新查询返回的记录少于第一个。在我看来,这两个代码块正在做同样的事情,应该返回相同数量的记录。任何人都可以看到为什么他们不会?我在这里缺少什么?
答案 0 :(得分:1)
第一个查询可能会将空对象添加到列表中(SingleOrDefault
将返回该类型的默认值,如果找不到匹配的实体,则返回null
)。因此,对于没有匹配关系的每个客户,您可以向List<>,
添加一个空对象,这会增加计数。
答案 1 :(得分:0)
在您的第一个场景中,您的最终List<Customers>
是否有重复项?
您正在调用Distinct
,但也会循环播放,这意味着您没有对整个集合执行Distinct
。
您的第二个示例是在整个集合上调用Distinct
。