多次调用Distinct()很重要

时间:2015-01-09 18:44:07

标签: c# sql-server linq entity-framework-6

假设我有一个查询,我希望有很多重复数据,比如

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的多次调用是否真的有帮助?

1 个答案:

答案 0 :(得分:0)

实际上,对Distinct的多次调用可能会影响您的表现。由于LINQ to Entities的性质,所有这些调用实际上都不会发生,直到最后.ToList()调用,因为LINQ将使用延迟执行(请参阅this link),此时查询构建器必须翻译第一个DistinctSelectMany,它们有自己的开销(更不用说翻译查询可能带来的额外位) - 您需要查看SQL事件探查器为此,但是)。

我认为你做这样的事情可能会更好:

var scienceDorms = dbContext.Classes
                            .Where(c => c.Subject == "Science")
                            .SelctMany(c => c.Students.SelectMany(s => s.Dorms))
                            .Distinct()
                            .ToList();

这将删除这两个子句,这些子句应该减少查询生成的开销,并且会给你相同的结果。

相关问题