2009-04-23 7 views
5

मान लीजिए कि मैं योजनाओं और दस्तावेजLINQ और साथ दो तालिकाओं में शामिल होने या खंड

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

है मैं जहां प्रत्येक PredicateBuilder प्रयोग करने के लिए खंड संरचित करते हैं। इसलिए, मेरे प्लान और मेरे दस्तावेज़ों में एक सही SQL कथन है।

मैं क्या करना चाहता हूं इन दो तालिकाओं में एक linq कथन में शामिल होना है। मेरी समस्या यह है कि, डिफ़ॉल्ट रूप से और स्थिति कहां से जुड़ी हुई है।

myPlans जहां खंड: ("% test%" जैसे p.name और "% bed%" जैसे p.name) या ("% test%" जैसे p.description और "% bed%" जैसे p.description)

मेरे दस्तावेज़ जहां खंड: (d.name जैसे "% test%" और d.name जैसे "% bed%") या (d.description "% test%" और d.description जैसे "% bed% ")

जब मैं दो वांछित परिणाम गठबंधन कहाँ खंड है:
कहाँ (d.ID = p.ID) और (myplans जहां खंड ऊपर) या (mydocument जहां खंड ऊपर)। मतलब, मैं उन दोनों को पसंद करूंगा जहां प्रत्येक तालिका में खंड "और" के बजाय "या" हो।

वर्तमान परिणाम जहां खंड है: कहाँ (d.ID = p.ID) और (myplans जहां खंड ऊपर) और (mydocument जहां खंड ऊपर)। मतलब, मैं उन दोनों को पसंद करूंगा जहां प्रत्येक तालिका में खंड "और" के बजाय "या" हो।

मैं इस तरह के बयान के गठन हूँ:

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

उत्तर

3

के लिए अपने वांछित परिणाम प्राप्त करने के लिए, आपको विधेय filterings करने की जरूरत है और एक बयान पर में जुड़ जाता है।

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 –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^