繁体   English   中英

使用实体框架优化LINQ查询

[英]Optimizing LINQ Query using Entity Framework

我有以下LINQ查询,以使用Entity Framework获取产品信息

productDetails.Items = (from productDetail in db.ToList()
                            select new prod
                            {
                                ID = productDetail.ID
                            ProdName = productDetail.ProductName,
                                        ...
                                        ...
                                        ...
                                        ...
                            Calaculation1 = GetCalaculation(productDetail.Calc1),
                            Calaculation1 = GetCalaculation(productDetail.Calc2),
                                        ...
                                        ...
                                        ...
                                        ...
                                        Calaculation15 = GetCalaculation(productDetail.Calc3)
                            }
                        ).ToList();

其中,GetCalaculation方法还使用LINQ查询数据库。 如果获取100条记录,则查询速度很慢。 我如何优化它?

首先,您的选择结构对我来说似乎有点“麻烦”,因为您为每个记录获取了15个Calaculation属性。 即使您在数据库中创建视图,该视图也将具有15个Joins to Calculations表,这对性能非常不利。 因此,您应该做的第一件事是查看对象结构并确认您确实需要在一个请求中提取所有这些计算。 如果您坚持不能更改您的结构,请执行以下步骤,这些步骤可以显着提高性能:

  1. 如果表不经常更改,则可以考虑创建实例化视图(SQL Server中具有聚集索引的视图),该视图将包含已计算的数据。 在这种情况下,查询将非常快,但是对表的插入/更新将慢得多。
  2. 不要在查询中使用db.ToList() -通过这样做,您将所有表都提取到内存中,然后对每个计算都发出单独的查询。

  3. 我对此查询有些困惑:

     var dbQuery = from calculation in db.Calculations where calculation.calc == calc1 select calculation); var totalsum = (from xyz in dbQuery select (Decimal?)xyz.calc).Sum() ?? 0; 

您要获取所有具有calc == calc1的记录,然后计算其总和? calc == calc1有多少条记录具有calc == calc1并乘以calc == calc1会不会容易calc1

db.Calculations.Count(c=>c.calc == calc1) * calc1;
  1. 如果记录数量有限,则将所有Calculations表与Product表( var calcTable = db.Calculations.ToList() )一起提取到内存中可能会比较便宜,那么GetCalaculation将与速度更快的内存中对象一起工作。 如果要执行此操作,则可以考虑并行执行或在单独的任务中执行。

暂无
暂无

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

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