2010-09-25 12 views
25

में बाएं शामिल होने का कार्यान्वयन कैसे करें मैं p.Person तालिका के लिए इस तरह की क्वेरी पर बाहरी शामिल होने का प्रयास कर रहा हूं। मैं यह कैसे करूँगा?जॉइन एक्सटेंशन विधि

यह उदाहरण http://ashishware.com/DSLinqExample.shtml

var onlyinfo = p.Person 
    .Where(n => n.FirstName.Contains('a')) 
    .Join(p.PersonInfo, 
     n => n.PersonId, 
     m => m.PersonId, 
     (n, m) => m) 
    .ToArray<Persons.PersonInfoRow>(); 

उत्तर

37

आम तौर पर छोड़ दिया LINQ में मिलती है से लिया जाता है समूह के साथ मॉडलिंग कर रहे हैं मिलती है, कभी कभी DefaultIfEmpty और SelectMany साथ संयोजन के रूप में:

var leftJoin = p.Person.Where(n => n.FirstName.Contains("a")) 
         .GroupJoin(p.PersonInfo, 
            n => n.PersonId, 
            m => m.PersonId, 
            (n, ms) => new { n, ms = ms.DefaultIfEmpty() }) 
         .SelectMany(z => z.ms.Select(m => new { n = z.n, m)); 

जोड़े का एक अनुक्रम दे देंगे कि (एन, एम) जहां np.Person और m से प्रविष्टि p.PersonInfo से प्रविष्टि है, लेकिन m कोई मिलान नहीं होने पर शून्य हो जाएगा।

(यह पूरी तरह से अपरीक्षित, btw है - लेकिन आप विचार वैसे भी :)

+1

पहला अनाम प्रक्षेपण काम नहीं करता है - कंपाइलर कहता है 'अमान्य अनाम प्रकार सदस्य घोषणाकर्ता। बेनामी प्रकार के सदस्यों को सदस्य असाइनमेंट, सरल नाम या सदस्य पहुंच ' – chester89

+1

@ chester89 के साथ घोषित किया जाना चाहिए: फिक्स्ड, धन्यवाद। –

11

वाम बाहरी के लिए क्वेरी के बाद की कोशिश शामिल हों देना चाहिए। यह परीक्षण किया गया है

var leftJoin = Table1 
       .GroupJoin(
           inner: Table2, 
        outerKeySelector: t1 => t1.Col1, 
        innerKeySelector: t2 => t2.Col2, 
         resultSelector: (t1, t2Rows) => new { t1, t2Rows.DefaultIfEmpty() } 
       ) 
       .SelectMany(z => 
        z.t2Rows.Select(t2 => 
         new { t1 = z.t1, t2 = t2 } 
        ) 
       ); 
3

यदि कोई इस प्रश्न पर आता है और इसे पूरा करने के लिए एक विस्तार विधि चाहता है, तो मैंने दूसरे उत्तरों के समान दृष्टिकोण का उपयोग करके एक बनाया है। नियमित रूप से विस्तार विधि के रूप में यह वही हस्ताक्षर है।

public static IEnumerable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, 
     IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, 
     Func<TOuter, TInner, TResult> resultSelector) 
    { 
     return outer 
      .GroupJoin(inner, outerKeySelector, innerKeySelector, (outerObj, inners) => 
      new 
      { 
       outerObj, 
       inners= inners.DefaultIfEmpty() 
      }) 
     .SelectMany(a => a.inners.Select(innerObj => resultSelector(a.outerObj, innerObj))); 
    } 
संबंधित मुद्दे