内存列表的LINQ查询在ToList()调用上需要几秒钟

时间:2018-03-07 23:15:40

标签: c# linq

即使对于内存列表,以下LINQ查询也很慢。执行需要几秒钟。

我尝试了List和IQueryable,两者都很慢。

你能提供任何缓慢的建议吗?

编辑:

该列表有350,000行。逻辑从存储过程转换为列表中的缓存表,并从内存中检索数据,而不是多次访问数据库。

var list = GetData().AsQueryable(); //GetData returns List<MDEntity>
var query = (from g in list join ux in list on new {
    Page = sPage, g.Property, Product = sProdAll, Section = (Guid?) null
  }
  equals new {
    ux.Page, ux.Property, ux.Product, Section = (Guid?) null
  }
  into ux_join from ux in ux_join.DefaultIfEmpty() join up in list on new {
    Page = sPage,
      g.Property,
      Section = (Guid?) null
  }
  equals new {
    up.Page,
      up.Property,
      Section = (Guid?) null
  }
  into up_join from up in up_join.DefaultIfEmpty() where(up.Product ?? string.Empty) == sProd || up.Product == sProdAlt where g.Section == (Guid?) null &&
  g.Page == sPage &&
  ((g.Product ?? string.Empty) == sProd || g.Product == sProdAlt || g.Product == sProdAll) orderby g.Property,
  g.Product,
  g.Language select new MDEntity {
    Property = g.Property,
      Product = (up.Page ?? string.Empty) == string.Empty ? Coalesce(up.Product, ux.Product, null, null) : Coalesce(up.Product, "SA", null, null),
      Language = Coalesce(up.Language, ux.Language, null, null),
      Value = Coalesce(up.Value, ux.Value, null, null)
  });
var result = query.ToList();

1 个答案:

答案 0 :(得分:0)

ToList()调用是实际查询执行的点。所以你上面的大块代码在你调用ToList()的时候被懒惰地执行。

鉴于我看到你能够使用AsQueryable,我几乎可以肯定这最终是一个数据库查询。虽然,我可能是错的。

在ToList()调用之前,C#不进行SQL调用。实际上,它不是内存操作。

这是一个相当复杂的查询,所以我并不感到惊讶,数据库可能需要几秒钟才能完成查询,而C#则需要返回结果列表。