2016-07-02 36 views
0

這裏是我的查詢與嵌套的foreach:你如何將這些嵌套的foreach中的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,所以我的錯誤,如枚舉不能安全ATLEAST繼續,因爲集合已更改。

我知道,如果有1分的foreach我可以將其轉換爲LINQ,如:

的foreach查詢:

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

LINQ查詢:

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

但我想知道如何你可以這樣做嵌套的foreach,如第一個代碼塊所示......

+2

除了'ToList'不是'LINQ','ForEach'是'名單的方法'。 Linq用於查詢數據,而不是修改數據。 –

+0

對不起,我誤解了這個概念。但是,你能告訴我如何在這種情況下使用ForEach? – Vishal

+2

爲什麼你想要,你原來的方式更清晰。另外,任何LINQ版本都會比較慢,因爲你必須調用'.ToList()'調用的所有額外內存。 –

回答

3

ForEach需要一個代理吃作爲參數。所以你可以編寫靜態方法或匿名函數。我正在用Anonymus方法寫作。但是你在上面做的方式是最好的方式比及如何使用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

是的,@hazevich你是對的。這會降低性能。但我只是給出了學習目的的答案。我還提到這不是正確的方法。 –