2012-06-15 2 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

Что-то, как это должно работать (код предупреждения Псевдо вперед !!)

EDIT Мне нравится использовать метод Хорхе по извлечению заказов лучше (используя содержит), но оставляя это здесь в качестве другой альтернативы. Однако утверждения, приведенные ниже в примере кода, сохраняются.

[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 не делает «массовых обновлений» хорошо. Вы либо должны получать и прокручивать свои заказы, либо записывать хранимую процедуру, которая может принимать массив идентификаторов и массовое обновление их таким образом. Если вы делаете только несколько за раз, то выше будет работать нормально. Если у вас есть тонны заказов, которые необходимо обновить, ORM, вероятно, не будет лучшим выбором. Я с нетерпением жду, если кто-нибудь еще подойдет лучше.

Отказ от ответственности: линия var localOrder = order должна гарантировать, что нет modified closure issues. Кроме того, ReSharper и другие инструменты могут иметь менее подробный способ написания вышеизложенного.

0

В ORMs, Вы должны принести запись сначала внести изменения в запись затем сохранить его обратно. Чтобы сделать это, я добавлю метод 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; 
} 

И я буду называть его из моего метода действий, как этот

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 случае, я хотел бы выполнить оператор Raw SQL только один запрос с использованием метода 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

Примечание: Вам необходимо позвонить SaveChanges из вашего DBContext в конце

Короткий ответ:

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 
Смежные вопросы