使用全部或否定任何
Use All or Negation of Any
使用 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 的任何作业。
我相信两者都一样,但哪个最快?
这些是完全等效的,因此在任何正常的查询提供程序实现中都应该具有相同的性能。
谈到 EF Core,两者都使用 NOT EXISTS (subquery)
条件转换为相同的 SQL,因此执行 SQL 查询的性能是相同的。当然,由于 SQL 没有针对 All
的特殊构造(SQL EXISTS
== LINQ Any
),因此 All
的翻译应该稍微比 Any
的翻译慢(基本上必须将其转换为 Any
的否定版本),但与执行和具体化查询的时间相比可以忽略不计。
因此,通常使用可读性更好的那个。我个人更喜欢Any
,因为它自然映射到SQL,因此更有可能得到查询提供者的支持。但由于 EF Core 两者都支持,所以这真的是一个品味问题。
使用 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 的任何作业。
我相信两者都一样,但哪个最快?
这些是完全等效的,因此在任何正常的查询提供程序实现中都应该具有相同的性能。
谈到 EF Core,两者都使用 NOT EXISTS (subquery)
条件转换为相同的 SQL,因此执行 SQL 查询的性能是相同的。当然,由于 SQL 没有针对 All
的特殊构造(SQL EXISTS
== LINQ Any
),因此 All
的翻译应该稍微比 Any
的翻译慢(基本上必须将其转换为 Any
的否定版本),但与执行和具体化查询的时间相比可以忽略不计。
因此,通常使用可读性更好的那个。我个人更喜欢Any
,因为它自然映射到SQL,因此更有可能得到查询提供者的支持。但由于 EF Core 两者都支持,所以这真的是一个品味问题。