我有一个小程序,需要做一些计算的数据范围。这个范围可能包含大约50万条记录。我只是查看了我的数据库,发现执行了一个group 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() } ); 在我的真实应用程序中,我得到了更多的子查询,这些子查询基于第一个查询选择的范围。我想我只是增加了一个很大的开销,让DB做出不同的选择。
现在,我简单地在第一个表达式之后调用.ToList()。
所以我的问题是,当查询构建器构建表达式树时,它组合了不同的IQueryable,这是正确的吗?
发布于 2012-10-03 02:47:07
是的,你是对的。LINQ表达式在您计算它们的时候就会延迟计算(例如,通过.ToList() )。此时,实体框架将查看整个查询并构建一条SQL语句来表示它。
在这种情况下,更明智的做法可能是对第一个查询执行而不是 evaluate,因为SQL数据库针对执行基于集合的操作进行了优化,比如分组和计数。不必强制数据库通过网络发送所有Test对象,将结果反序列化为内存中的对象,然后在本地执行分组和计数,通过让SQL数据库只返回结果计数,您可能会看到更好的性能。
https://stackoverflow.com/questions/12696276
复制相似问题