entity-framework-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 的 Job 的项目。
我相信两者都做同样的事情,但哪个最快?
解决方案
这些是完全等效的,因此在任何正常的查询提供程序实现中都应该具有相同的性能。
说到 EF Core,两者都使用NOT EXISTS (subquery)
条件转换为相同的 SQL,因此执行 SQL 查询的性能是相同的。当然,由于 SQL 对All
(SQL EXISTS
== LINQ Any
) 没有特殊的构造,所以 的翻译All
应该比Any
( 基本上必须将其转换为 的否定版本Any
) 的翻译稍慢,但与执行和实现的时间相比可以忽略不计询问。
因此,通常使用可以为您提供更好可读性的那个。我个人更喜欢Any
,因为它自然映射到 SQL,因此有更大的机会被查询提供程序支持。但由于 EF Core 两者都支持,所以这确实是一个品味问题。
推荐阅读
- scala - 如何在 Play 中使用 Akka Streams 将消息从 websocket 客户端发送到 Akka Source
- mysql - 从嵌套选择中对列进行分组
- javascript - 使用 jest 和酵素测试高阶组件
- r - Scale_size_manual 线指定替代线大小
- vue.js - Vue.set 不更新对象
- swift - Swift Google Maps - 加载语言环境图块
- python - ScikitLearn ML 模型得到 cv_results.mean() =0 和 cv_results.std() = 0
- php - 如何按区域阻止站点
- c - C中的MPI循环
- c# - Xceed.Words.NET 表跨越分页符