【问题标题】:Too much data in Contains (Linq): How to increase performaceContains (Linq) 中的数据过多:如何提高性能
【发布时间】:2021-02-09 12:52:56
【问题描述】:

我有一个这样的 linq 查询:

from a in context.table_A
   join b in
   (from temp in context.table_B
   where idlist.Contains(temp.id)
   select temp)
   on a.seq_id equals b.seq_id into c
   where
   idlist.Contains(a.id)
   select new MyObject
   {
     ...
   }).ToList();
  • idlist 是列表
  • 我遇到的问题是 idlist 的值太多(几十万到几百万条记录)。它适用于很少的记录,但是当记录太多时,包含函数会出错。

错误日志是

由于内部资源不足,无法创建查询计划 查询处理器。这是一个罕见的事件,只发生在非常 复杂查询或引用大量数据的查询 表或分区。让查询变得简单。

我想提高这部分的表现。有什么想法吗?

【问题讨论】:

  • 尝试批量检查。
  • idlist的来源是什么?
  • idlist 是这个函数的参数
  • 您能否反转查询并加入 IdList 而不是从中加入?或者,重组您的数据,以便可以在一个查询中查找您的引用。

标签: c# asp.net sql-server linq


【解决方案1】:

我建议安装扩展 linq2db.EntityFrameworkCore 并使用快速 BulkCopy 的临时表

public class IdItem
{
   public int Id { get; set; }
}

...

var items = idList.Select(id => new IdItem { Id = id });

using var db = context.CreateLinqToDBConnection();
using var temp = db.CreateTempTable("#IdList", items);

var query =
   from a in context.table_A
   join id1 in temp on a.Id equals id1.Id
   join b in context.table_B on a.seq_id equals b.seq_id
   join id2 in temp on b.Id equals id2.Id
   select new MyObject
   {
      ...
   };

// switch to alternative translator
var query = query.ToLinqToDB();

var result = query.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多