2014-04-03 177 views
0

我有一個LINQ DB操作,看起來像這樣:LINQ結合選擇和更新查詢

using (SomeDC TheDC = new SomeDC()) 
{ 
    var SomeData = (from .... select x).ToList(); 

    if (SomeData.Count() > 0) 
    { 
     foreach (.... in SomeData) { x.SomeProp = NewProp; } 

     TheDC.SubmitChanges(); 
    } 
} 

正如你所看到的,我讀書清單,然後我更新這份名單,最後我把它寫回數據庫。有沒有辦法在一個查詢中結合這個操作?

謝謝。

回答

3

有沒有辦法在一個查詢中結合這個操作?

不在Linq中 - 如果存在更新模式,則可以直接執行一條SQL語句,但查詢和更新是兩個單獨的方法。

2

不,你應該繼續使用一個簡單的循環來操作你的objects.There是在LINQ。至於更新都沒法顧名思義:用於不查詢更新語言集成查詢LINQ

您可以手動爲您的更新操作生成sql查詢,然後通過SqlQuery方法執行它,或者如果您願意,也可以使用Entity Framework執行Stored Procedures

+1

+1,但'伯爵()'只是調用'Count'如果底層集合是'List'(技術上_any_'ICollection')。然而,使用「任何」都是一種改進。 –

+0

不會有'任何'是一個更好的測試,雖然甚至不需要,因爲foreach不會執行 –

+0

@BVaVale如果底層枚舉不實現'ICollection',那麼是的,但是因爲它確實,不,不是真;至少不夠重要。 – Servy

0

實際上並沒有一個更新選擇語句,但是您可以縮短代碼並刪除ToList()調用。

此外,計數檢查是不必要的,因爲foreach不會爲空循環操作。

using (SomeDC TheDC = new SomeDC()) 
{ 
    var SomeData = (from .... select x); 
    foreach (.... in SomeData) { x.SomeProp = NewProp; } 
    TheDC.SubmitChanges(); 
} 

另外,如果你是不顧一切地做它在一個單一的執行,你可以滾你自己的擴展方法來幫助。

public static class DatabaseHelper { 

    public static void Apply<T>(this IEnumerable<T> collection, Action<T> action) { 
    if (collection == null) { // Sanity check 
     return; 
    } 
    foreach (var item in collection) { 
     action(item); 
    } 
    } 
} 

那麼你的代碼將

using (SomeDC TheDC = new SomeDC()) { 
    (from ... select x).Apply(x => x.SomeProp = NewProp); 
    TheDC.SubmitChanges(); 
}