【发布时间】:2015-01-30 11:29:12
【问题描述】:
我有一个完整的外部联接查询从 sql 紧凑型数据库中提取数据(我使用 EF6 进行映射):
var query =
from entry in left.Union(right).AsEnumerable()
select new
{
...
} into e
group e by e.Date.Year into year
select new
{
Year = year.Key,
Quartals = from x in year
group x by (x.Date.Month - 1) / 3 + 1 into quartal
select new
{
Quartal = quartal.Key,
Months = from x in quartal
group x by x.Date.Month into month
select new
{
Month = month.Key,
Contracts = from x in month
group x by x.Contract.extNo into contract
select new
{
ExtNo = month.Key,
Entries = contract,
}
}
}
};
如您所见,我使用嵌套组来构建结果。 有趣的是,如果我删除 AsEnumerable() 调用,查询的执行时间会增加 3.5 倍:~210ms vs ~60ms。当它第一次运行时,差异要大得多:39000(!)ms vs 1300ms。
我的问题是:
我做错了什么,也许这些分组应该以不同的方式完成?
为什么第一次执行需要这么长时间?我知道应该构建表达式树等,但是 39 秒?
在我的情况下,为什么 linq to db 比 linq to entity 慢?如果可能,在处理之前从 db 加载数据通常会更慢且更好吗?
谢谢!
【问题讨论】:
-
AsEnumerable在分组之前将数据带入内存。删除它意味着对数据库运行多个子查询,导致它变慢。
标签: c# performance linq entity-framework grouping