Это общая форма (как уже указано в других ответах)
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()
..iterate над этим результирующим набором, устанавливая нулевое значение по умолчанию для 'строки' с правой стороны, и устанавливая результат соединения строки правой стороны со значением '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» (это также будет применяться к типам, которые не являются «изначально»). обнуляемый, например, double, float).
Вы можете выполнить несколько левых внешних объединений, просто связав приведенный выше синтаксис.