繁体   English   中英

如何提高EF中的AsEnumerable性能

[英]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 ,查询就不再是“可查询的”。 这意味着您要做的就是下载整个BilBillMastersBilBillDetails表,然后对应用程序中的表(而不是SQL Server)进行一些处理。 这注定是缓慢的。

显而易见的解决方案是显而易见的-不使用AsEnumerable它基本上将处理从SQL服务器(具有所有数据和索引等)移到您的应用程序服务器(既没有应用程序又不需要从DB服务器获取数据)。所有数据)。

至少,您要尽可能限制下载的数据量。 例如,在使用AsEnumerable之前按CompanyIDCustomerID过滤表。 但是,总的来说,我没有理由无法在SQL Server上完全执行查询-由于很多原因,这通常是首选的解决方案。

总体而言,听起来好像您正在使用AsEnumerable来解决另一个问题,但这几乎绝对是一个糟糕的解决方案-至少在使用AsEnumerable之前不对数据进行进一步过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM