对 Distinct() 进行多次调用很重要
本文关键字:调用 Distinct | 更新日期: 2023-09-27 18:36:53
>假设我有一个查询,我希望有很多重复的数据,像这样
var scienceDorms = dbContext.Classes
.Where(c => c.Subject = "Science")
.SelectMany(c => c.Students)
.Distinct()
.SelctMany(s => s.Dorms)
.Distinct()
.ToList();
超过 1 个Distinct()
语句的存在在这里是否有帮助?
如果这是对象的 linq,我会假设对 Distinct()
的第一次调用将大大减少进入第二个SelectMany()
的数据量。
但是,我对实体框架和 sql 的内部工作原理的了解有些粗略,我担心对 Distinct
的额外调用可能会使 EF 生成的 SQL 复杂化,而不会给我带来太多好处,或者更糟糕的是,以某种方式损害 EF 或 SQL 可能在幕后执行的某种优化。
多次调用Distinct
真的有帮助吗?
实际上,多次调用Distinct
可能会损害您的表现。由于 LINQ 对实体的性质,所有这些调用实际上都不会发生,直到最后的.ToList()
调用,因为 LINQ 将采用延迟执行(请参阅此链接),此时查询生成器必须转换第一个Distinct
和SelectMany
,这有自己的开销(更不用说转换后的查询可能具有哪些额外的位 - 您需要查看 SQL不过,分析器)。
我想你最好做这样的事情:
var scienceDorms = dbContext.Classes
.Where(c => c.Subject == "Science")
.SelctMany(c => c.Students.SelectMany(s => s.Dorms))
.Distinct()
.ToList();
这将删除这两个子句,这应该会减少查询生成的开销,并为您提供相同的结果。