যেহেতু এটি পদ্ধতি (এক্সটেনশন) সিনট্যাক্স ব্যবহার করে বাম বাহ্যিক যোগদানের জন্য ডি ফ্যাক্টোর এসও প্রশ্ন হিসাবে মনে হয়েছে, তাই আমি ভেবেছিলাম যে আমি বর্তমানে নির্বাচিত উত্তরের একটি বিকল্প যুক্ত করব যা (আমার অভিজ্ঞতায় কমপক্ষে) আমি সাধারণভাবে যা করেছি তার থেকে বেশি হয়েছে পরে
// 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
অংশটি কেবলমাত্র আপনি নির্বাচন করতে চান তার উপর নির্ভর করে।