1

我有一个小程序需要对数据范围进行一些计算。该范围可能包含大约 50 万条记录。我只是查看了我的数据库,发现 agroup by已执行。

我以为结果是在第一行执行的,后来我只是在 RAM 中处理数据。但现在我认为查询生成器结合了表达式。

var Test = db.Test.Where(x => x > Date.Now.AddDays(-7));
var Test2 = (from p in Test 
             group p by p.CustomerId into g 
             select new { UniqueCount = g.Count() } ); 

在我的真实世界应用程序中,我得到了更多基于第一个查询选择的范围的子查询。我想我只是增加了很大的开销来让数据库做出不同的选择。

现在我基本上只是.ToList()在第一个表达式之后调用。

所以我的问题是,查询构建器在构建表达式树时结合了不同的 IQueryable 是否正确?

4

1 回答 1

4

是的,你是对的。LINQ 表达式在您评估它们的那一刻被延迟评估(.ToList()例如,通过)。在那个时间点,Entity Framework 将查看整个查询并构建一个 SQL 语句来表示它。

在这种特殊情况下,不评估第一个查询可能更明智,因为 SQL 数据库已针对执行基于集合的操作(如分组和计数)进行了优化。与其强制数据库通过网络发送所有Test对象,将结果反序列化为内存中的对象,然后在本地执行分组和计数,不如让 SQL 数据库只返回结果计数,您可能会看到更好的性能。

于 2012-10-02T18:47:07.353 回答