【问题标题】:Use All or Negation of Any使用全部或任何否定
【发布时间】:2020-01-13 11:50:24
【问题描述】:

使用 Entity Framework Core 2.2 我有以下查询:

dbContext.Projects.Where(x => x.Jobs.All(y => y.UserId != userId)) 

dbContext.Projects.Where(x => !x.Jobs.Any(y => y.UserId == userId))

所以我得到了所有没有 Job.UserId 等于 userId 的 Job 的项目。

我相信两者都做同样的事情,但哪个最快?

【问题讨论】:

    标签: entity-framework-core entity-framework-core-2.2


    【解决方案1】:

    这些是完全等效的,因此在任何正常的查询提供程序实现中都应该具有相同的性能。

    说到 EF Core,两者都使用NOT EXISTS (subquery) 条件转换为一个相同的 SQL,因此执行 SQL 查询的性能是相同的。当然由于 SQL 没有针对 All 的特殊构造(SQL EXISTS == LINQ Any),All 的翻译应该比 Any 的翻译稍慢(基本上必须将其转换为否定Any 的版本),但与执行和具体化查询的时间相比可以忽略不计。

    因此,通常使用可读性更好的那个。我个人更喜欢Any,因为它自然映射到SQL,因此有更大的机会被查询提供者支持。但由于 EF Core 两者都支持,所以这确实是一个品味问题。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      相关资源
      最近更新 更多