【问题标题】:How to combine LINQ Query with a Null check如何将 LINQ 查询与 Null 检查结合使用
【发布时间】:2021-09-23 16:58:41
【问题描述】:

是否可以组合这些 LINQ 查询?如果是这样,我会更难阅读。

docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id);
if (docCount == null)
{
   docCount = dbContext.Documents.Count(x => x.DocumentRequest.Guid == Guid);
}

【问题讨论】:

  • 我不关注。为什么docCount 可以是null
  • 你应该不需要。 Enumerable.Count 可能会返回 0 但不会返回 null

标签: c# .net linq


【解决方案1】:

尝试将这些组合起来效率非常低,因为它会导致 O(N^2) 复杂度。

如果您将 null 检查更改为检查 0 整数,则您的方法可以正常工作,因为返回值不能为 null,因为 int 是 value type

试试这个:

docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id);
if (docCount == 0)
   docCount = dbContext.Documents.Count(x => x.DocumentRequest.Guid == Guid);

【讨论】:

    【解决方案2】:

    如前所述,这应该是 0 检查。 现在,如果您的问题是“如果我最终处于第二种情况,我是否可以避免进行 2 次枚举”,答案是肯定的:

    (int idCount, int guidCount) = dbContext.Documents.Aggregate((0, 0), ((int id, int guid) acc, Document doc)
      => (acc.id + (doc.Id == id ? 1 : 0), acc.guid + (doc.Guid == guid ? 1 : 0)));
    docCount = idCount != 0 ? idCount : guidCount;
    

    只迭代文档一次。

    这更具可读性吗? ... 不。性能和可读性更高:

    int idCount = 0;
    int guidCount = 0;
    foreach (var document in dbContext.Documents)
    {
        if (document.Id == id)
            idCount++;
    
        if (document.Guid == guid)
            guidCount++;
    }
    docCount = idCount != 0 ? idCount : guidCount;
    

    值得吗?这取决于您的数据。如果枚举您的文档是您在适当的基准测试后确定的热门路径,并且是您可以在代码库/架构中做出的最佳改进(例如,远程数据库上的数亿个文档,本地程序上没有副本,并且这个计数经常运行),那么是的。

    否则,this is premature optimization,坚持你的解决方案,用 0 代替 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多