问题描述
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();