2012-06-15 43 views
0

我想知道如何以Linq方式运行此查询。Asp.Net MVC3,在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; } 
} 

回答

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(); 
0

像这样的东西应该工作(警告虚拟代码领先!)

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

[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和其他工具可能没有详细描述上述的方法。

0

在奥姆斯,你必须先获取该记录进行的更改记录并保存回。要做到这一点,我将增加一个UpdateOrder方法我Repositary这样

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

,我会调用它从我的行动方法,这样

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

在这种方法中,如果你要更新多记录数量,你正在执行那么多更新语句到数据库。在这种purticular情况下,我想用Database.SqlQuery方法

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

注只有一个查询执行的原始SQL语句:您需要在最后

简短的回答叫SaveChangesDBContext

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