【问题标题】:Asp.Net MVC3, Update query in LinqAsp.Net MVC3,在 Linq 中更新查询
【发布时间】:2012-06-18 20:11:33
【问题描述】:

我想知道如何以 Linq 方式运行此查询。

UPDATE orders SET shipDate = '6/15/2012' WHERE orderId IN ('123123','4986948','23947439')

我的代码,

[HttpGet]
public void test()
{
    EFOrdersRepository ordersRepository = new EFOrdersRepository();
    var query = ordersRepository.Orders;

    // How to run this query in LINQ
    // Query : UPDATE orders SET shipDate = '6/15/2012' WHERE orderId IN ('123123','4986948','23947439')
}

EFOrdersRepository.cs

public class EFOrdersRepository
{
    private EFMysqlContext context = new EFMysqlContext();

    public IQueryable<Order> Orders
    {
        get { return context.orders; }
    }
}

EFMysqlContext.cs

class EFMysqlContext : DbContext
{
     public DbSet<Order> orders { get; set; }
}

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 linq


    【解决方案1】:

    这样的东西应该可以工作(警告伪代码!)

    编辑我喜欢使用 Jorge 更好地检索订单的方法(使用包含),但将其留在这里作为另一种选择。但是,代码示例下面的语句仍然适用。

    [HttpGet]
        public void test()
        {
            EFOrdersRepository ordersRepository = new EFOrdersRepository();
            var query = ordersRepository.Orders.Where(x=>x.orderId == '123123' || 
    x.orderId == '4986948' || x.orderId = '23947439').ToList();
                foreach(var order in query){
                   var localOrder = order; 
                   order.ShipDate = '06/15/2012';
                }
                ordersRepository.SaveChanges();
            }
    

    基本上,LINQ 不能很好地进行“批量更新”。您要么必须获取并循环遍历您的订单,要么编写一个存储过程,该过程可以采用一组 id 并以这种方式批量更新它们。如果你一次只做几个,上面的就可以了。如果您有大量订单需要更新,那么 ORM 可能不是最佳选择。我期待着看看其他人是否有更好的方法。

    免责声明:var localOrder = order 行是为了确保没有modified closure issues。此外,ReSharper 和其他工具的上述编写方式可能不太冗长。

    【讨论】:

      【解决方案2】:

      其实看下面的代码很简单

      EFOrdersRepository db = new EFOrdersRepository();
      int[] ids= new string[] { "123123", "4986948", "23947439"};
      //this linq give's the orders with the numbers
      List<Order> orders = db.Order().ToList()
                              .Where( x => ids.Contains(x.orderId.Contains));
      
      foreach(var order in orders)
      {
          order.ShipDate = '06/15/2012';
          db.Entry(usuario).State = EntityState.Modified;
      }
      
        db.SaveChanges();
      

      【讨论】:

        【解决方案3】:

        在 ORM 中,您必须先获取记录对记录进行更改,然后再将其保存回来。为此,我将像这样向我的存储库添加一个 UpdateOrder 方法

        public bool UpdateOrder(Order order)
        {
           int result=false;
           int n=0;
           context.Orders.Attach(order);
           context.Entry(order).State=EntityState.Modified;
           try
           {
              n=context.SaveChanges();
              result=true;
           }
           catch (DbUpdateConcurrencyException ex)
           {
              ex.Entries.Single().Reload();
              n= context.SaveChanges();        
              result= true;
           }
          catch (Exception ex2) 
          {
            //log error or propogate to parent 
          }
          return result;
        }
        

        我会像这样从我的 Action 方法中调用它

        int orderId=123232;
        var orders=ordersRepository.Orders.Where(x=> x.orderId.Contains(orderId)).ToList();
        if(orders!=null)
        {
           foreach(var order in orders)
           {
             order.ShipDate=DateTime.Parse('12/12/2012);
             var result= ordersRepository.UpdateOrder();     
           }
        }
        

        在这种方法中,如果您必须更新许多记录,则您正在对数据库执行许多更新语句。在这种特殊情况下,我想使用Database.SqlQuery 方法只用一个查询来执行原始 SQL 语句

        string yourQry="UPDATE orders SET shipDate = '6/15/2012' 
                             WHERE orderId IN ('123123','4986948','23947439')";
        var reslt=context.Database.SqlQuery<int>(yourQry);
        

        【讨论】:

          【解决方案4】:

          注意:您需要在最后从您的DBContext 调用SaveChanges

          简答:

          var f = new[] { 123123, 4986948, 23947439 };
          var matchingOrders = orders.Where(x => f.Contains(x.ID)).ToList();
          matchingOrders.ForEach(x => x.ShipDate = newDate);
          

          完成测试:

              // new date value
              var newDate = new DateTime(2012, 6, 15);
              // id's
              var f = new[] { 123123, 4986948, 23947439 };
              // simpulating the orders from the db
              var orders = Builder<Order2>.CreateListOfSize(10).Build().ToList();
              orders.Add(new Order2 { ID = 123123 });
              orders.Add(new Order2 { ID = 4986948 });
              orders.Add(new Order2 { ID = 23947439 });
          
              // selecting only the matching orders
              var matchingOrders = orders.Where(x => f.Contains(x.ID)).ToList();
          
              matchingOrders.ForEach(x => Console.WriteLine("ID: " +  x.ID + " Date: " + x.ShipDate.ToShortDateString()));
              // setting the new value to all the results
              matchingOrders.ForEach(x => x.ShipDate = newDate);
              matchingOrders.ForEach(x => Console.WriteLine("ID: " + x.ID + " Date: " + x.ShipDate.ToShortDateString()));
          

          输出:

          ID: 123123 Date: 1/1/0001
          ID: 4986948 Date: 1/1/0001
          ID: 23947439 Date: 1/1/0001
          ID: 123123 Date: 6/15/2012
          ID: 4986948 Date: 6/15/2012
          ID: 23947439 Date: 6/15/2012
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-21
            • 2018-06-04
            • 2018-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多