包含Linq中的数据过多:如何提高性能

问题描述

我有一个这样的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的值太多(数十万到几百万条记录)。很少记录的情况下工作正常,但是当记录太多时,contains函数会出错。

错误日志是

由于缺少内部资源,无法创建查询计划 查询处理器。这是罕见的事件,仅在 复杂查询或引用大量查询查询 表或分区。简化查询

我想提高本节的性能。有什么想法吗?

解决方法

我建议安装扩展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();