Это общая форма (как уже указано в других ответах)
var c =
from a in alpha
join b in beta on b.field1 equals a.field1 into b_temp
from b_value in b_temp.DefaultIfEmpty()
select new { Alpha = a, Beta = b_value };
Однако вот объяснение, которое, я надеюсь, прояснит, что это на самом деле означает!
join b in beta on b.field1 equals a.field1 into b_temp
по существу создаетотдельный результирующий набор b_temp, который фактически содержит нулевые «строки» для записей справа (записи в «b»).
Затем следующая строка:
from b_value in b_temp.DefaultIfEmpty()
.. повторяетсяповерх этого результирующего набора, установив нулевое значение по умолчанию для «строки» с правой стороны, и установив результат соединения правой строки со значением «b_value» (то есть значением, которое находится с правой стороны,если есть совпадающая запись, или 'null', если ее нет).
Теперь, если правая часть является результатом отдельного запроса LINQ, она будет состоять из анонимных типов, которые могут толькобыть «что-то» или «ноль».Однако, если он перечислим (например, List - где MyObjectB является классом с 2 полями), то можно быть конкретным относительно того, какие значения по умолчанию 'null' используются для его свойств:
var c =
from a in alpha
join b in beta on b.field1 equals a.field1 into b_temp
from b_value in b_temp.DefaultIfEmpty( new MyObjectB { Field1 = String.Empty, Field2 = (DateTime?) null })
select new { Alpha = a, Beta_field1 = b_value.Field1, Beta_field2 = b_value.Field2 };
Это гарантируетсамо по себе 'b' не равно нулю (но его свойства могут быть нулевыми, используя заданные вами значения по умолчанию), и это позволяет вам проверять свойства b_value без получения исключения нулевой ссылки для b_value.Обратите внимание, что для обнуляемого DateTime тип (DateTime?), То есть «обнуляемый DateTime» должен быть указан как «Тип» нулевого значения в спецификации для «DefaultIfEmpty» (это также будет применяться к типам, которые не являются «изначально»'nullable, например, double, float).
Вы можете выполнить несколько левых внешних объединений, просто связав приведенный выше синтаксис.