1

我有返回带有过滤子项的父项的查询:

 Context.ContextOptions.LazyLoadingEnabled = false;
  var query1 = (from p in Context.Partners
                          where p.PartnerCategory.Category == "03"
                                || p.PartnerCategory.Category == "02"
                          select new
                                     {
                                         p,
                                         m = from m in p.Milk
                                             where m.Date >= beginDate
                                                   && m.Date <= endDate
                                                   && m.MilkStorageId == milkStorageId
                                             select m,
                                         e = p.ExtraCodes,
                                         ms = from ms in p.ExtraCodes
                                              select ms.MilkStorage,
                                         mp = from mp in p.MilkPeriods
                                              where mp.Date >= beginDate
                                                    && mp.Date <= endDate
                                              select mp
                                     }).Where(
                                         p =>
                                         p.p.ExtraCodes.Select(ex => ex.MilkStorageId).Contains(
                                             milkStorageId) ).OrderBy(p => p.p.Name);
 var partners = query1.AsEnumerable().ToList();

查询返回 200 条记录,从 IOrderedQueryable ToList() 转换非常慢。为什么?

在 sql server management studio 中分析查询后,我注意到查询执行时间为 1 秒并返回 2035 条记录。

4

3 回答 3

1

它慢的原因是因为当你这样做ToList的时候是实际查询执行的时间。这称为延迟执行

您可能会看到:LINQ 和延迟执行

我认为AsEnumerable将其转换为列表时不需要这样做,您可以直接这样做:

var partners = query1.ToList();
于 2012-12-18T07:10:07.553 回答
1

造成这种情况的原因可能有很多,如果没有任何分析器信息,这只是猜测工作,甚至是一些对代码和领域非常了解的人的受过高等教育的猜测工作通常是错误的。

您应该分析代码,因为瓶颈很可能在数据库中,所以按照@Likurg 的建议获取命令文本并在数据库中进行分析。您可能缺少一个或多个索引。

你也可以对查询本身做一些事情,如果没有别的东西可以让它更容易理解并且可能更快

例如

p.p.ExtraCodes.Select(ex => ex.MilkStorageId).Contains(milkStorageId)

是真的

p.p.ExtraCodes.Any(ex => ex.MilkStorageId == milkStorageId)

并且可以移动到第一个 where 子句,这可能会降低您创建的匿名类型对象的数量。也就是说,最有可能的情况是,您在比较中使用的众多字段之一没有索引,这可能会导致对结果集中的每个元素进行大量表扫描。

索引可能加快速度的一些字段是

  • 名称
  • m.日期
  • m.MilkStorageId
  • mp.日期
  • PartnerCategory.Category
于 2012-12-18T07:58:35.413 回答
0

首先,使用这个查看生成的查询

Context.GetCommand(query1).CommandText;

然后在 db 中调用此命令。并检查分析器读取了多少条记录。

于 2012-12-18T07:42:41.690 回答