2009-04-23 17 views
5

Diciamo che ho dei progetti e documentiLINQ to SQL e unire due tavoli con clausola OR

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

ho strutturato la clausola WHERE per ogni utilizzo PredicateBuilder. Quindi, myPlans e myDocuments hanno un'istruzione SQL corretta.

Quello che mi piacerebbe fare è unire queste due tabelle in un'unica istruzione linq. Il problema che sto avendo è che, per impostazione predefinita, la condizione AND sta unendo le clausole where.

Clausola myPlans Where: (p.name come "% test%" AND p.name come "% bed%") OR (p.descrizione come "% test%" AND p.description come "% bed%")

myDocuments Clausola where: (d.name come "% test%" AND d.name come "% bed%") OR (d.descrizione come "% test%" AND d.descrizione come "% letto% ")

Quando combino il risultato due il desiderata dove clausola è:
dove (d.ID = p.ID) E (myplans where sopra) OR (mydocument clausola dove sopra). Significato, mi piacerebbe che le due clausole in cui le tabelle fossero "o" invece di "E".

Il risultato corrente dove clausola è: Dove (d.ID = p.ID) E (myplans where sopra) E (mydocument clausola dove sopra). Significato, mi piacerebbe che le due clausole in cui le tabelle fossero "o" invece di "E".

che sto formando la dichiarazione come questa:

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

risposta

3

Al fine di ottenere il risultato desiderato, è necessario fare i filtraggi predicato e si unisce in su singola istruzione.

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

Questo accade perché si sta facendo un "primo passaggio" che filtra i piani ei documenti che corrispondono alla vostra predicati, e poi unendo questi risultati solo, in modo efficace facendo un AND. Come ha detto Basilio, dovresti fare il tuo join/filtro nello stesso passaggio. Si potrebbe provare qualcosa di simile:

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 

O simile:

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

Mi piace la tua risposta troppo. +1 –