我正在使用包含许多元素的列表进行 EF 查询,我似乎遇到了此处列出的相同问题列出的相同问题(SQL Server 抛出错误,因为 IN 语句中的元素太多)。我想知道是否有其他方法可以做到这一点。
如果命令设置临时表,ExecuteStoreQuery 或 ExecuteStoreCommand 会起作用吗?
谢谢
我正在使用包含许多元素的列表进行 EF 查询,我似乎遇到了此处列出的相同问题列出的相同问题(SQL Server 抛出错误,因为 IN 语句中的元素太多)。我想知道是否有其他方法可以做到这一点。
如果命令设置临时表,ExecuteStoreQuery 或 ExecuteStoreCommand 会起作用吗?
谢谢
是的,从大量键中进行选择的最佳方法是使用临时表。
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);
}
}
然后有一个存储过程来按键匹配临时表。
如果该列表数据来自数据库查询,请不要调用.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 上下文操作)进行插入和删除,以获得最佳性能。