Метод 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());
}
Я знаю результат. Я прочитал исходный код GroupJoin. Я добавлю некоторую информацию на вопрос. – Vince
Если вы знаете результат «GroupJoin», вы уже должны видеть, что это не совсем то же самое, что и стандартные результаты запроса соединения sql ... – MarcinJuraszek