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



以下 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();

ToList(( 调用是实际查询的执行点。因此,您上面拥有的那一大块代码在您调用 ToList(( 的那一刻被延迟执行。

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

在 ToList(( 调用之前,C# 不执行 SQL 调用。所以实际上,它不是内存中的操作。

这是一个相当复杂的查询,因此数据库可能需要几秒钟才能完成查询,然后 C# 返回结果列表,这并不奇怪。