2013-07-21 42 views
0

我有過濾代碼,我重構,目前有大量的IF塊,以確定應用過濾器的方式。將多個Linq鏈接在哪裏作爲OR調用,而不是AND

它目前查看過濾器的各種選項,並構建一個完成一切的大Linq(到EF)語句。

當您鏈接多個Linq .Where調用時,生成的操作是AND。如何鏈接多個.Where調用時如何做OR。

例如

users = users.Where(l => l.Location == "MyLocation") 
users = users.Where(r => r.Role == "Role") 

其結果將是一樣的

users = users.Where(u => u.Location == "MyLocation" && u.Role == "Role") 

,我想

users = users.Where(u => u.Location == "MyLocation" || u.Role == "Role") 

感謝。

+6

您正在尋找'PredicateBuilder'。 – SLaks

+0

只顯示slalk指出什麼 - http://www.albahari.com/nutshell/predicatebuilder.aspx – terrybozzio

+0

@SLaks感謝堆,我不知道它,這是一個偉大的代碼。你可以請添加一個答案,我會接受它。 – Sam

回答

0
users = users.Where(l => l.Location == "MyLocation") 
    .Union(users.Where(r => r.Role == "Role")); 

這是否適合您?

+1

該解決方案應該可以工作。然而它有一個主要的缺點:它使用'Union',這肯定會導致比較兩組(取決於Linq的實現...)。在大數據庫的情況下,使用PredicateBuilder的解決方案應該更加高效。 –

0

我使用代碼來執行OK。 users = users.Where(u => u.Location == "MyLocation" || u.Role == "Role")

我的測試代碼是遵循:

private class User 
    { 
     public string Location = "MyLocation"; 
     public string Role = "Role"; 
     public string Data = "TestData"; 
    } 
private void LinqOr() 
    { 
     //throw new NotImplementedException(); 
     IEnumerable<User> users = new User[] { 
         new User{Location="MyLocation",Role="Role",Data="Data1"}, 
         new User{Location="MyLocation",Role="Role",Data="Data2"}, 
         new User{Location="MyLocationB",Role="Role3",Data="Data3"}, 
         new User{Location="MyLocationB",Role="Role4",Data="Data4"}, 
         new User{Location="MyLocationC",Role="Role",Data="Data5"}, 
         new User{Location="MyLocationC",Role="Role",Data="Data6"}, 
         new User{Location="MyLocationD",Role="Role7",Data="Data7"}, 
     }; 

     //users = users.Where(l => l.Location == "MyLocation"); 
     //users = users.Where(R => R.Role == "Role"); 
     //users = users.Where(u => u.Location == "MyLocation" && u.Role == "Role"); 
     users = users.Where(u => u.Location == "MyLocation" || u.Role == "Role"); 
     string result = ""; 
     foreach (User user in users) 
     { 
      result += user.Location + " " + user.Role + " " + user.Data + "\r\n"; 
     } 
     MessageBox.Show(result); 
    } 


    private void btnTest_Click(object sender, EventArgs e) 
    {   
     LinqOr(); 
    } 

結果如該圖所示。

enter image description here

相關問題