2016-07-02 6 views
0

Вот мой запрос с вложенным Еогеаспом:Как преобразовать этот вложенный Еогеасп в Linq

foreach (Order order in xOrders) 
{ 
    foreach (OrderItemDetail oid in order.OrderItemDetails) 
    { 
     db.Entry(oid).Reload(); 
    } 

    foreach (Dispatch dispatch in order.Dispatches) 
    { 
     foreach (DispatchItemDetail did in dispatch.DispatchItemDetails) 
     { 
      db.Entry(did).Reload(); 
     } 

     db.Entry(dispatch).Reload(); 
    } 

    db.Entry(order).Reload(); 
} 

Теперь я хочу, чтобы преобразовать его в чистый LINQ, так что я безопаснее по крайней мере за такие ошибки, как Перечисления не может продолжайте, потому что коллекция была изменена.

Я знаю, если есть 1 Еогеасп я могу преобразовать его в LINQ, как:

Еогеасп запрос:

foreach (Order order in xOrders) 
{ 
    db.Entry(order).Reload(); 
} 

LINQ запрос:

xOrders.ToList().ForEach(x => db.Entry(x).Reload()); 

Но я хочу знать, как вы можете сделать это для Nested foreach, как показано в первом блоке кода ....

+2

Другого, чем 'ToList', который не является' LINQ', 'ForEach' является методом на' 'Списка . Linq предназначен для запроса данных, а не для изменения данных. –

+0

Извините, я неправильно понял концепцию. Но не могли бы вы рассказать мне, как я могу использовать ForEach в этом случае? – Vishal

+2

Зачем вам это нужно, так, как вы это делали, более ясно. Кроме того, любая версия LINQ будет медленнее из-за всей дополнительной памяти, используемой вызовами '.ToList()', которые вам нужно будет сделать. –

ответ

3

The ForEach принимает делегат в качестве параметра. Таким образом, вы можете написать статический метод или анонимную функцию. Я пишу с помощью метода Анонимуса. Но, как вы делаете выше, является лучшим способом, чем при использовании ForEach()

xOrders.ToList().ForEach((x) => { 
    x.OrderItemDetails.ToList().ForEach(o => db.Entry(o).Reload()); 
    x.Dispatches.ToList().ForEach((D) => { 
     D.DispatchItemDetails.ToList().ForEach(DI => db.Entry(DI).Reload()); 
     db.Entry(D).Reload(); 
    }); 
    db.Entry(x).Reload(); 
    }); 
+1

Спасибо, что отлично работает. Ваш код дал мне ошибку, затем я просто изменил его и обновил в вашем ответе. Спасибо, что ответили на мой вопрос. – Vishal

+2

Похоже на беспорядок, он ухудшает производительность, увеличивает использование памяти. Я не понимаю, почему кто-то хочет сделать такой код. – hazevich

+1

Да, @ Хазевич, вы правы. Это ухудшает производительность. Но я просто даю ответ для цели обучения. Я также упомянул, что это неправильный путь. –

Смежные вопросы