【问题标题】:LINQ in Entity Framework 6 with large .Any()实体框架 6 中的 LINQ 与大型 .Any()
【发布时间】:2014-03-07 01:29:51
【问题描述】:

我有一个 EF6 查询,它采用 IDs 列表并执行查询:

public IList<Audit> AuditsByIDs(List<int> ids)
{
    return _db.Audits
        .Include(p => p.User)
        .Where(p => ids.Any(i => i == p.Id)).ToList();
}

它适用于 少量 id,但当达到数百个时,我会收到错误:

您的 SQL 语句的某些部分嵌套得太深。重写 查询或将其分解为更小的查询。

如何让查询仅在 ids 传入后才返回?我无法更改数据库:(

【问题讨论】:

  • 如果可能的话,我会使用 Intersect,但它似乎不是 :( 你能告诉我们生成的 SQL 吗?
  • 对于通过 ID 搜索的大型数据结构,您更喜欢一些索引结构,如 HashSet 或 Dictionary,会快得多。
  • @Some1Pr0 不,它不会。它是 LINQ to Entities,无论如何它都已转换为 IN (item1, item2, ...) 作为 SQL 查询的一部分。

标签: c# sql linq entity-framework entity-framework-6


【解决方案1】:

改用Contains

public IList<Audit> AuditsByIDs(List<int> ids)
{
    return _db.Audits
        .Include(p => p.User)
        .Where(p => ids.Contains(p.Id)).ToList();
}

应在生成的 SQL 查询中将其转换为 IN

【讨论】:

  • 在大型列表中完美运行。如果允许,我会在几分钟后将其标记为已接受。
  • 列表的大小无关紧要。在这种情况下,无论列表有多大,都应该使用Contains 而不是Any。更好,因为生成的 SQL 更好。
  • 当心。对于足够大的列表,Contains 仍然会抛出错误。
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多