创建从EF 4.0到SQL Server 2008 R2的单个查询,而不是多个查询

时间:2014-04-11 20:03:23

标签: c# entity-framework-4

在下面的代码中,将对数据库运行多个查询,以便一次插入一行。

EF导致多个数据库攻击: 当我调用c.SaveChanges时,EF 4.0将对数据库运行多个UPDATE语句,但每次数据库访问只会执行一次UPDATE。这意味着如果我们有EF 4.0生成的1000个UPDATE语句,那么我们最终将进行1000次数据库访问,这在我看来并不是一个好的和最佳的数据方法。

有没有办法让EF 4.0在单个数据库之旅中为所有记录更新运行单个批处理查询?可能是,如果我可以获得UPDATE查询(我的意思是SQL查询)对于每个记录更新,然后我可以将所有这些查询放入单个批处理查询并将批处理查询发送到数据库,但我不知道是否可以在EF 4.0中获取每个记录的UPDATE查询。

 public void SaveVendorOrders(int vendorId, int parentVendorId, string tag,
                              string desc, int productSegment, int productCategory)     
 {  
  using (Vendor c = new Vendor())
        {
            var query = (from p in c.Orders
                         where (p.VendorID == vendorId ||
                                p.ParentVendorID == parentVendorId)
                         select p);

            if (query.ToList().Count() > 0)
            {
                for (int i = 0; i <= query.ToList().Count() - 1; i++)
                {
                    query.ToList()[i].OrderTag = tag;
                    query.ToList()[i].OrderDescription = desc;
                    query.ToList()[i].ProductSegment = productSegment;
                    query.ToList()[i].ProductSegmentCategory = productCategory;
                }

                c.SaveChanges();
            }
        }
 }

编辑1:

正如SJuan76和Hamlet Hakobyan所指出的,反复调用ToList将重复执行查询。但即使这样也可以通过清理代码来解决,因此只调用一次ToList,我的问题仍然存在:如何将多个更新组合到一个批量更新查询中?

1 个答案:

答案 0 :(得分:3)

该查询旨在延迟执行。它实际上执行您枚举查询的乳清,或者,例如,调用ToList()。要避免多次枚举,您必须在方法中调用ToList()一次内存数据。

using (Vendor c = new Vendor())
{
  var query = (from p in c.Orders
               where (p.VendorID == vendorId ||
                      p.ParentVendorID == parentVendorId)
               select p).ToList();

  if (query.Count() > 0)
  {
      for (int i = 0; i <= query.Count() - 1; i++)
      {
          query[i].OrderTag = tag;
          query[i].OrderDescription = desc;
          query[i].ProductSegment = productSegment;
          query[i].ProductSegmentCategory = productCategory;
      }

      c.SaveChanges();
  }
}