2009-04-23 46 views
5

比方說,我有圖紙和資料LINQ to SQL和加入兩個表或條款

Dim myPlans = _context.Plans.Where(predicate1) 
Dim myDocuments = _context.Documents.Where(predicate2) 

我已經構造的地方,爲每個PredicateBuilder條款。所以,myPlans和myDocuments有一個正確的SQL語句。

我想要做的是將這兩個表加入到一個linq語句中。我遇到的問題是,默認情況下,AND條件是加入where子句。 (p.name爲「%test%」,p.name爲「%bed%」)或(p.description如「%test%」)和p.description如「%bed%」 )

myDocuments Where子句:(d.name像「%test%」和d.name像「%bed%」)OR(d.description像「%test%」)和d.description像「%bed% 「)

當我將二者結合起來的期望結果WHERE子句:
凡(d.ID = p.ID)AND (myplans where子句上文)OR(myDocument中where子句上文)。意思是,我希望每個表格中的兩個子句都是「或」而不是「和」。

當前結果where子句是: 凡(d.ID = p.ID)AND (myplans where子句上文)AND(myDocument中where子句上文)。意思是,我希望每個表格中的兩個子句都是「或」而不是「和」。

我形成的聲明是這樣的:

Dim test = From d in myDocuments _ 
      Join p in MyPlans on d.ID Equals p.ID _ 
      Select d.Name, p.Name 

回答

3

爲了達到您想要的結果,你需要做謂語的濾波,並加入了關於單個語句。

Dim myCriteria() = {"test", "bed"} 
Dim test = from d in _context.Documents _ 
      join p in _context.Plans on d.ID Equals p.ID _ 
      where (myCriteria.Contains(d.Name) OR _ 
        myCriteria.Contains(d.Descrition)) _ 
      OR (myCriteria.Contains(p.Name) OR _ 
       myCriteria.Contains(p.Description)) _ 
      select Document = d.Name, Plan = p.Name 
2

這是發生,因爲你正在做一個「第一關」,其過濾匹配您的謂詞的計劃和文件,並然後只有加入這些成果,有效地做一個AND。就像巴西利奧說的那樣,你應該在同一個過程中進行加入/過濾。你可以嘗試這樣的事:

Dim test = From d in _context.Documents _ 
      Join p in _context.Plans on d.ID Equals p.ID _ 
      Where predicate1(p) Or predicate2(d) 
      Select d.Name, p.Name 

或類似的:

Dim test = From d in _context.Documents _ 
      From p in _context.Plans _ 
      Where d.ID = p.ID And (predicate1(p) Or predicate2(d)) 
      Select d.Name, p.Name 
+0

我喜歡你的答案了。 +1 – 2009-04-25 22:02:55