2013-05-03 56 views
0

我正在做一个包含许多元素的列表的EF查询,我似乎遇到列出的相同问题here(其中SQL Server发生错误,因为有太多IN语句中的元素)。我想知道是否有另一种方式来做到这一点。EF查询其中列表包含很多元素

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

感谢

回答

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上下文操作),以获得最佳性能删除。

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); 
     } 
    } 

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