[英]How to improve AsEnumerable performance in EF
我在vs2012 ef上工作。
我的edmx中有1对多的映射表结构。
var query = (
from bm in this.Context.BilBillMasters.AsEnumerable ()
join g in
(
from c in this.Context.BilBillDetails.AsEnumerable ()
group c by new { c.BillID }
)
on bm.BillID equals (g == null ? 0 : g.Key.BillID) into bDG
from billDetailGroup in bDG.DefaultIfEmpty()
where bm.IsDeleted == false
&& (companyID == 0 || bm.CompanyID == companyID)
&& (userID == 0 || bm.CustomerID == userID)
select new
{
bm.BillID,
BillNo = bm.CustomCode,
bm.BillDate,
BillMonth = bm.MonthFrom,
TransactionTypeID = bm.TransactionTypeID ?? 0,
CustomerID = bm.CustomerID,
Total = billDetailGroup.Sum(p => p.Amount),//group result
bm.ReferenceID,
bm.ReferenceTypeID
}
);
This method is taking close 30 seconds to return back the result in the first run.
不知道出什么问题了。 我尝试获取结果列表,并尝试了也很慢的elementAt(0)。
一旦使用AsEnumerable
,查询就不再是“可查询的”。 这意味着您要做的就是下载整个BilBillMasters
和BilBillDetails
表,然后对应用程序中的表(而不是SQL Server)进行一些处理。 这注定是缓慢的。
显而易见的解决方案是显而易见的-不使用AsEnumerable
它基本上将处理从SQL服务器(具有所有数据和索引等)移到您的应用程序服务器(既没有应用程序又不需要从DB服务器获取数据)。所有数据)。
至少,您要尽可能限制下载的数据量。 例如,在使用AsEnumerable
之前按CompanyID
和CustomerID
过滤表。 但是,总的来说,我没有理由无法在SQL Server上完全执行查询-由于很多原因,这通常是首选的解决方案。
总体而言,听起来好像您正在使用AsEnumerable
来解决另一个问题,但这几乎绝对是一个糟糕的解决方案-至少在使用AsEnumerable
之前不对数据进行进一步过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.