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

标签 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();

这确实更快,但现在新查询返回的记录比第一个少。在我看来,这两段代码在做同样的事情,应该返回相同数量的记录。谁能看出他们为什么不这样做?我在这里缺少什么?

最佳答案

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

关于c# - 为什么这两个 linq 查询返回不同数量的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20060754/

相关文章:

c# - Delphi 4 和/或 Delphi 5 可执行文件能否集成到 C# 应用程序中?

c# - JavaScript 字符串中的求值数学表达式

.net - 将 WCF 服务限制为特定客户端应用程序

c# - 如何在.NET(JWT 验证 token )中抛出 401 未经授权的异常?

javascript - 选择选项后禁用输入字段

c# - 复杂分组依据

.net - 在.NET中使用反射调用泛型方法

c# - 小型集合中 linq 和 INTERSECT/EXCEPT 的低性能

mysql - 提高mysql性能

c# - super 简单的 C# if/else 语法语义,即为什么应该使用大括号的一个很好的例子