查询处理器耗尽内部资源,无法在EF中生成查询计划

时间:2015-07-06 11:02:31

标签: c# sql-server entity-framework

我在EF中有一个查询,其中有一个字符串值List,它检查另一个表中是否存在。

请考虑以下查询以获取更多详情。

代码

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

感谢。

1 个答案:

答案 0 :(得分:0)

向数据库发出批量的1000个项目ID,或使用本机SQL并提交表值参数或填充有SqlBulkCopy的临时表。

我很惊讶你得到了特别的信息。参数限制大约是2000个参数。您的查询应该被拒绝。