![](/img/trans.png)
[英]Entity Framework Core - “The query processor ran out of internal resources” error only using EF, executing SQL server and get the results
[英]The query processor ran out of internal resources and could not produce a query plan in EF
我在EF中有一個查詢,該查詢中有一個字符串值列表,它會檢查另一個表中是否存在。
請考慮以下查詢以獲取更多詳細信息。
碼
List<string> ItmsStock = item.Select(ds => ds.ItemNum).ToList(); // Currently, This List items count is 80,000 records.
this.Db.Database.CommandTimeout = 180;
var existsStckList = Db.Stocktakes.Where(ds => ItmsStock.Contains(ds.ItemNo)).Select(ds => ds.ItemNo).ToList();
item.RemoveAll(ds => existsStckList.Contains(ds.ItemNum));
var ItmsExists = Db.Items.Where(ds => ItmsStock.Contains(ds.ItemNo)).Select(ds => ds.ItemNo).ToList();
ItmsExists = Db.Stocktakes.Where(ds => !ItmsExists.Contains(ds.ItemNo)).Select(ds => ds.ItemNo).ToList();
我在互聯網上搜索,發現轉換后的sql使用IN
來檢查是否存在。 因此, IN
的限制導致了問題。 我的問題是,如何在不使用for循環的情況下有效地執行上述操作。
如果有人可以幫助我,我將不勝感激。
編輯
以前,我有以下代碼。 在遇到以下代碼的性能問題后,我編寫了上面的代碼。
foreach (var stockitems in item)
{
if (Db.Stocktakes.Any(a => a.ItemNo == stockitems.ItemNum))
{
StockResult ss = new StockResult();
ss.ItemNumber = stockitems.ItemNum;
ss.FileName = stockitems.FileName;
Stockres.Add(ss);
}
else if (!Db.Stocktakes.Any(a => a.ItemNo == stockitems.ItemNum) && Db.Items.Any(a => a.ItemNo == stockitems.ItemNum))
{
var ItemNo = stockitems.ItemNum;
var AdminId = Convert.ToInt32(Session["AccId"]);
var CreatedOn = System.DateTime.Now;
int dbres = Db.Database.ExecuteSqlCommand("insert into Stocktake values({0},{1},{2})", ItemNo, AdminId, CreatedOn);
Db.SaveChanges();
totalcount = totalcount + 1;
}
else
{
StockResult sss = new StockResult();
sss.ItemNumber = stockitems.ItemNum;
sss.FileName = stockitems.FileName;
Stockitemsdup.Add(sss);
}
}
謝謝。
向數據庫發出1000個項目ID的批次,或使用本機SQL並提交表值參數或填充有SqlBulkCopy
的臨時表。
我很驚訝您收到特定消息。 參數限制約為2000個參數。 您的查詢應該已被拒絕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.