चूंकि यह विधि (विस्तार) सिंटैक्स का उपयोग करते हुए बाएं बाहरी जोड़ के लिए वास्तविक तथ्य है, इसलिए मैंने सोचा कि मैं वर्तमान में चयनित उत्तर के लिए एक विकल्प जोड़ दूंगा (कम से कम मेरे अनुभव में) आमतौर पर मैं क्या कर रहा हूं उपरांत
// Option 1: Expecting either 0 or 1 matches from the "Right"
// table (Bars in this case):
var qry = Foos.GroupJoin(
Bars,
foo => foo.Foo_Id,
bar => bar.Foo_Id,
(f,bs) => new { Foo = f, Bar = bs.SingleOrDefault() });
// Option 2: Expecting either 0 or more matches from the "Right" table
// (courtesy of currently selected answer):
var qry = Foos.GroupJoin(
Bars,
foo => foo.Foo_Id,
bar => bar.Foo_Id,
(f,bs) => new { Foo = f, Bars = bs })
.SelectMany(
fooBars => fooBars.Bars.DefaultIfEmpty(),
(x,y) => new { Foo = x.Foo, Bar = y });
एक साधारण डेटा सेट का उपयोग करके अंतर प्रदर्शित करने के लिए (यह मानकर कि हम स्वयं मूल्यों में शामिल हो रहे हैं):
List<int> tableA = new List<int> { 1, 2, 3 };
List<int?> tableB = new List<int?> { 3, 4, 5 };
// Result using both Option 1 and 2. Option 1 would be a better choice
// if we didn't expect multiple matches in tableB.
{ A = 1, B = null }
{ A = 2, B = null }
{ A = 3, B = 3 }
List<int> tableA = new List<int> { 1, 2, 3 };
List<int?> tableB = new List<int?> { 3, 3, 4 };
// Result using Option 1 would be that an exception gets thrown on
// SingleOrDefault(), but if we use FirstOrDefault() instead to illustrate:
{ A = 1, B = null }
{ A = 2, B = null }
{ A = 3, B = 3 } // Misleading, we had multiple matches.
// Which 3 should get selected (not arbitrarily the first)?.
// Result using Option 2:
{ A = 1, B = null }
{ A = 2, B = null }
{ A = 3, B = 3 }
{ A = 3, B = 3 }
विकल्प 2 ठेठ बाईं बाहरी जुड़ाव परिभाषा के लिए सही है, लेकिन जैसा कि मैंने पहले उल्लेख किया है कि डेटा सेट के आधार पर अक्सर अनावश्यक रूप से जटिल होता है।
GroupJoin
से बायाँ बाहरीSelectMany
भाग जुड़ता है, केवल उस भाग की आवश्यकता होती है जो आप चयन करना चाहते हैं।