2009-04-23 17 views
5

en Her kullanarak PredicateBuilder için nereye maddesini yapılandırdık Ben Planları ve BelgelerLINQ to SQL ile iki tablo katılın VEYA fıkra

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

var diyelim. Bu yüzden, myPlans ve belgelerim doğru SQL deyimine sahip.

Yapmak istediğim, bu iki tabloyu bir linq ifadesine birleştirmektir. Sorun şu ki, varsayılan olarak AND koşulu, buradaki koşullara katılıyor.

myPlans Nerede yan tümce: ("% sınama%" gibi p.name ve "% yatak%" gibi p.name gibi) VEYA ("% sınama%" gibi bir yazım))

myDocuments Where cümlesi: ("% test%" gibi bir d.name ve "% yatak%" gibi d.name gibi) VEYA ("% test%" gibi d.description ve "% bed% gibi" d.description) ") hükmü olduğu yerde iki istenen sonucu birleştirmek

:
(d.ID = p.ID) VE (myplans nerede fıkra üzeri) YA (benimDosya nerede fıkra yukarıda). Anlamı, her iki tablodaki cümlelerin "Ve" yerine "veya" olması isterim.

maddesi olup, mevcut sonuç,

: (d.ID = p.ID) ve (myplans burada maddesi ile elde edilmiş) ve (benimDosya burada maddesi üzerinde). Anlamı, her iki tablodaki cümlelerin "Ve" yerine "veya" olması isterim.

böyle ifadeyi kuruyorum: En istenilen sonucu elde etmek için

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

cevap

3

, sen yüklem filterings yapmanız gereken tek ekstresinde katılır.

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

Eğer yüklemler eşleşen planları ve belgeleri filtreleyen "ilk geçiş" yapıyoruz çünkü bu oluyor ve etkili bir şekilde bir AND yapıyor, yalnızca bu sonuçları katılmadan sonra. Basilio'nun dediği gibi, birleştirme/filtreyi de aynı geçişte yapmalısınız. Böyle bir şey deneyebilirsiniz: Benzer

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 

Veya:

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

Ben de cevap gibi. +1 –