2013-07-19 2 views
2

Метод GroupJoin не имеет прямого эквивалента в реляционной базе данных , но он реализует надмножество внутренних объединений и левое внешнее соединение . Левое внешнее соединение представляет собой объединение, которое возвращает каждый элемент первого (левого) источника данных , даже если он не имеет коррелированных элементов в другом источнике данных .Почему GroupJoin не оставил внешнее соединение?

Я думаю, что GroupJoin является эквивалентом левого соединения. Потому что весь элемент внешнего будет возвращен с набором совпадающих элементов во внутреннем. если во внутреннем дворе нет совпадающего элемента, пустая коллекция будет сопряжена с элементом во внешнем.

Но почему msdn сказать, что?

Я прочитал исходный код GroupJoin и Join. Примером может служить Марцин Джурашек. но я думаю, что мы можем использовать следующий код.

Users.GroupJoin(Cars,user=>id,Car=>userId,(user,cars)=> 
if(cars.count==0) 
{ 
//John -- NULL 
} 
else 
{ 
//Ted -- [ 2, 3 ] 
} 
return result; 
); 

оригинальная логика GroupJoin:

Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, comparer); 
foreach (TOuter current in outer) 
{ 
    yield return resultSelector(current, lookup[outerKeySelector(current)]); 
} 

мы можем переписать LeftJoin:

Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, 
foreach (TOuter current in outer) 
{ 
    yield return resultSelector(current, lookup[outerKeySelector(current)].DefaultIfEmpty()); 
} 

ответ

8

Рассмотрим следующую ситуацию:

TableA - Users 

id -- name 
1 -- Tom 
2 -- John 
3 -- Ted 

TableB - Cars 

id -- userId 
1 -- 1 
2 -- 3 
3 -- 3 

Стандартный LEFT JOIN для пользователя имя и идентификатор автомобиля вернутся:

name -- carId 
Tom -- 1 
John -- NULL 
Ted -- 2 
Ted -- 3 

Используя GroupJoin вы получите:

name -- carId 
Tom -- [ 1 ] 
John -- [ ] 
Ted -- [ 2, 3 ] 

разницу?

В SQL левый идем показан столько раз, сколько осталось подходящих элементов, соответствующих JOIN состоянии.

На GroupJoin вы получите один элемент слева и коллекцию правых предметов, соответствующих JOIN состоянии.

+0

Я знаю результат. Я прочитал исходный код GroupJoin. Я добавлю некоторую информацию на вопрос. – Vince

+0

Если вы знаете результат «GroupJoin», вы уже должны видеть, что это не совсем то же самое, что и стандартные результаты запроса соединения sql ... – MarcinJuraszek

1

Я бы добавил комментарий, но мой представитель не достаточно высок, чтобы это сделать.

Marcin правильный, простой ответ на ваш вопрос; Да, вы МОЖЕТЕ сделать левое внешнее объединение результатов возврата так же, как GroupJoin, но почему?

GroupJoin делает левое внешнее соединение, а затем группирует результаты. «Левая внешняя связь» просто вернет список (по примеру Marcin), не делая никакой группировки, которую вы можете сделать, если хотите, но (по какой-либо причине) вам может и не понадобиться.

EDIT: Правописание

+0

спасибо. Я просто хочу удостовериться, что GroupJoin может делать то, что осталось сделать. – Vince

Смежные вопросы