对 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() 进行多次调用很重要

实际上,多次调用Distinct可能会损害您的表现。由于 LINQ 对实体的性质,所有这些调用实际上都不会发生,直到最后的.ToList()调用,因为 LINQ 将采用延迟执行(请参阅此链接),此时查询生成器必须转换第一个DistinctSelectMany,这有自己的开销(更不用说转换后的查询可能具有哪些额外的位 - 您需要查看 SQL不过,分析器)。

我想你最好做这样的事情:

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

这将删除这两个子句,这应该会减少查询生成的开销,并为您提供相同的结果。