EF查询其中List包含很多元素

时间:2013-05-03 13:36:36

标签: c# entity-framework

我正在使用包含许多元素的列表进行EF查询,我似乎遇到了列出here的相同问题(其中SQL Server抛出错误,因为IN语句中有太多元素)。我想知道是否有另一种方法可以做到。

如果命令设置临时表,ExecuteStoreQuery或ExecuteStoreCommand会工作吗?

由于

2 个答案:

答案 0 :(得分:0)

如果该列表数据来自数据库查询,请不要在源查询上调用.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上下文操作)进行插入和删除,以获得最佳性能。

答案 1 :(得分:0)

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

http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/

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

    public void bulkCopy(String tmpTableName, DataTable table)
    {
        using (SqlBulkCopy bulkCopy =
                       new SqlBulkCopy((SqlConnection)connection))
        {
            bulkCopy.DestinationTableName = tmpTableName;
            bulkCopy.WriteToServer(table);
        }
    }

然后有一个存储过程来按键匹配临时表。