C# EF查询,其中列表包含许多元素

C# EF查询,其中列表包含许多元素,c#,entity-framework,C#,Entity Framework,我正在使用一个包含许多元素的列表执行EF查询,我似乎遇到了列出的同一个问题(SQL Server抛出错误,因为in语句中的元素太多)。我想知道是否还有别的办法 如果命令设置临时表,ExecuteStoreQuery或ExecuteStoreCommand是否有效 谢谢如果列表数据来自数据库查询,请不要在源查询中调用.ToList()。而是将IQueryable传递给查询 var statuses = context.Statuses.Where(o => o.IsActive).Selec

我正在使用一个包含许多元素的列表执行EF查询,我似乎遇到了列出的同一个问题(SQL Server抛出错误,因为in语句中的元素太多)。我想知道是否还有别的办法

如果命令设置临时表,ExecuteStoreQuery或ExecuteStoreCommand是否有效


谢谢

如果列表数据来自数据库查询,请不要在源查询中调用
.ToList()
。而是将
IQueryable
传递给查询

var statuses = context.Statuses.Where(o => o.IsActive).Select(o => o.Id);
var data = context.Orders.Where(o => statuses.Contains(o.StatusId));
或者,您可以使用类似的方法

var sessionId = Guid.NewGuid();
foreach (var s in statusList)
    insert into SearchValues(sessionId, s); // pseudo code

var statuses = context.SearchValues.Where(o => o.SessionId == sessionId).Select(o => o.Id);
var data = context.Orders.Where(o => statuses.Contains(o.StatusId));

delete from SearchValues where SessionId == @sessionId // pseudo code

您可能希望使用SQL查询(而不是EF上下文操作)执行插入和删除操作以获得最佳性能。

是的,从大量键列表中选择的最佳方法是使用临时表

如果您使用的是MsSQL和C#,那么SqlBulkCopy将以最快的速度获取密钥列表

    public void bulkCopy(String tmpTableName, DataTable table)
    {
        using (SqlBulkCopy bulkCopy =
                       new SqlBulkCopy((SqlConnection)connection))
        {
            bulkCopy.DestinationTableName = tmpTableName;
            bulkCopy.WriteToServer(table);
        }
    }
然后有一个存储过程来通过键匹配临时表