c# - why is GroupJoin not left outer join? -


the groupjoin method has no direct equivalent in relational database terms, implements superset of inner joins , left outer joins. left outer join join returns each element of first (left) data source, if has no correlated elements in other data source.

i think groupjoin equivalent of left join. because element of outer returned collection of matched items in inner. if no matched item found in inner, empty collection paired element in outer.

but why msdn that?

i have read source code of groupjoin , join. marcinjuraszek supply example. think can use following code.

users.groupjoin(cars,user=>id,car=>userid,(user,cars)=> if(cars.count==0) { //john -- null } else { //ted  -- [ 2, 3 ] } return result; ); 

original logic groupjoin:

lookup<tkey, tinner> lookup = lookup<tkey, tinner>.createforjoin(inner, innerkeyselector, comparer); foreach (touter current in outer) {     yield return resultselector(current, lookup[outerkeyselector(current)]); } 

we can rewrite leftjoin:

lookup<tkey, tinner> lookup = lookup<tkey, tinner>.createforjoin(inner, innerkeyselector,  foreach (touter current in outer) {     yield return resultselector(current, lookup[outerkeyselector(current)].defaultifempty()); } 

consider following situation:

tablea - users  id -- name 1  -- tom 2  -- john 3  -- ted  tableb - cars  id -- userid 1  -- 1 2  -- 3 3  -- 3 

standard left join user name , car id return:

name -- carid tom  -- 1 john -- null ted  -- 2 ted  -- 3 

using groupjoin you'll get:

name -- carid tom  -- [ 1 ] john -- [ ] ted  -- [ 2, 3 ] 

see difference?

in sql left side idem shown many times many right items matching joincondition exist.

on groupjoin you'll left side item once , collection of right side items matching joincondition.


Comments