我正在做一個包含許多元素的列表的EF查詢,我似乎遇到列出的相同問題here(其中SQL Server發生錯誤,因爲有太多IN語句中的元素)。我想知道是否有另一種方式來做到這一點。EF查詢其中列表包含很多元素
如果命令設置了臨時表,ExecuteStoreQuery或ExecuteStoreCommand會工作嗎?
感謝
我正在做一個包含許多元素的列表的EF查詢,我似乎遇到列出的相同問題here(其中SQL Server發生錯誤,因爲有太多IN語句中的元素)。我想知道是否有另一種方式來做到這一點。EF查詢其中列表包含很多元素
如果命令設置了臨時表,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上下文操作),以獲得最佳性能刪除。
是的,從一個大的鍵列表中選擇最好的方法是使用臨時表。
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);
}
}
然後有一個存儲過程通過鍵匹配臨時表。