2008-12-15 75 views
3

在另一個posting: Does Linq-To-Sql support composable queries中討論瞭如何動態地組合/連接where子句。這似乎是用「AND」(即第一個where子句和第二個where子句通過AND連接)完成的。我想知道的是,如果有一種方法可以用OR來組合Linq查詢。LINQ支持組合「OR查詢」嗎?

例子:

var people = from p in Person 
      where p.age < 18 
      select p 

var otherPeople = from p in people 
        where p.firstName equals "Daniel" 
        select p 

這給人以「丹尼爾」的名字和未滿18歲。我在尋找的語法加入這些發現誰擁有的「第一人的名字Daniel「或者低於18.

注意:我使用的是ADO.net Data Services,因此我沒有.Contains()提供給我。

編輯:聯盟建議(Garry Shutler)正是我所需要的功能。我也遇到兩種可能的問題吧:

  1. 看起來它將使多個數據庫命中,如果我是做第三個條件(工會似乎需要一個IEnumerable作爲它的參數) - 我希望建立在代碼中添加多個AND和OR語句,然後執行一個請求。

    var people = from p in Person 
          where p.age < 18 || p.firstName == "Daniel" 
          select p; 
    

    或者你只是給出一個簡單的例子:

  2. 聯盟不被ADO.Net數據服務(非常失望)

回答

6

是你想要的那樣簡單的支持?

在這種情況下,你可以使用:

var under18 = from p in Person 
       where p.age < 18 
       select p; 

var daniels = from p in Person 
       where p.firstName == "Daniel" 
       select p; 

var combined = under18.Union(daniels); 

LinqToSql可能是足夠聰明的將其轉換成一個OR,但我不那麼肯定。

2

Joe Albahari使用PredicateBuilder怎麼樣?

var predicate = PredicateBuilder.False<Person>(); 
predicate = predicate.Or(p => p.age < 18); 
predicate = predicate.Or(p => p.firstName == "Daniel"); 

var query = Person.Where(predicate); 
+0

謂詞生成器似乎並不支持ADO.Net數據服務的查詢?在執行上述結果時:「錯誤將Linq表達式轉換爲URI:表達式((False或Invoke(m => m.FirstName =」Daniel「),[10007]))或Invoke(p =>(p.age < 18),[10007]))不被支持。「 – ChrisHDog 2008-12-15 23:23:00

+0

實際上這意味着Linq不能支持ADO.NET數據服務或者表達式。 – 2008-12-16 01:18:13

1

我寫了關於如何實現在我的博客上搜索集合中的關鍵值的查詢。 以下是相關鏈接。

Contains Operations in ADO.NET Data Services Part I

Contains Operations in ADO.NET Data Services Part II

利用這一點,你可以寫一個像這樣
//The set in which we have to search for a match
List<string> citiesIWillVisit = new List<string>() {"London","Berlin","Prague"};
var customersAround = nwContext.Customers
.IsIn<Customers>(citiesIWillVisit, c=> c.City);
foreach (Customers localCustomer in customersAround) {
System.Console.WriteLine(localCustomer.ContactName);
}