簡體   English   中英

查詢處理器用盡了內部資源,無法在EF中生成查詢計划

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM