Ответ 1
В LINQ to Entities, думайте в терминах отношений, а не SQL-соединений. Следовательно, буквальный эквивалент внешнего соединения SQL для объекта Person
с отношением один к нулю или одним отношением к CustomerInfo
будет:
var q = from p in Context.People
select new
{
Name = p.Name,
IsPreferredCustomer = (bool?)p.CustomerInfo.IsPreferredCustomer
};
L2E будет объединять соединение, так что если CustomerInfo имеет значение null, то все выражение оценивается как null. Следовательно, приведение к обнуляемому bool, потому что предполагаемый тип не-nullable bool не смог сохранить этот результат.
Для одного-ко-многим обычно требуется иерархия, а не плоский набор результатов в стиле SQL:
var q = from o in Context.Orders
select new
{
OrderNo = o.OrderNo,
PartNumbers = from od in o.OrderDetails
select od.PartNumber
}
Это похоже на левое соединение, поскольку вы по-прежнему получаете заказы без каких-либо подробностей, но это граф как OO, а не такой набор, как SQL.