假设我有一个查询,我希望有很多重复数据,比如
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()
的数据量。
但是,我对Entity Framework和sql内部工作原理的了解有点粗略,我担心对Distinct
的额外调用可能会使EF生成的sql复杂化而不会给我带来太多好处,或者更糟糕的是,某种程度上会影响EF或SQL可能在幕后进行的某种优化。
对Distinct
的多次调用是否真的有帮助?
答案 0 :(得分:0)
实际上,对Distinct
的多次调用可能会影响您的表现。由于LINQ to Entities的性质,所有这些调用实际上都不会发生,直到最后.ToList()
调用,因为LINQ将使用延迟执行(请参阅this link),此时查询构建器必须翻译第一个Distinct
和SelectMany
,它们有自己的开销(更不用说翻译查询可能带来的额外位) - 您需要查看SQL事件探查器为此,但是)。
我认为你做这样的事情可能会更好:
var scienceDorms = dbContext.Classes
.Where(c => c.Subject == "Science")
.SelctMany(c => c.Students.SelectMany(s => s.Dorms))
.Distinct()
.ToList();
这将删除这两个子句,这些子句应该减少查询生成的开销,并且会给你相同的结果。