Посмотрите на звонок DefaultIfEmpty()
. Если у Customer
нет связанных Package
, коллекция packages
будет пустой. Вызов DefaultIfEmpty()
возвращает объект пакета default
(null
) для пустых packages
коллекций. Это означает, что при вызове SelectMany
вы можете получить null
s для y
в последнем параметре SelectMany
. Чтобы преодолеть это, вы можете использовать Нулевой условный оператор (?.
):
var allCustomers = customers
.GroupJoin(
packages,
customer => customer.PackId,
packages => packages.PackId,
(customer, packages) => new { customer, packages })
.SelectMany(
y => y.packages.DefaultIfEmpty(),
(x, y) => new { CustId = x.customer.CustomerId, PackId = y?.PackId })
.ToList();
Также следует отметить, что в этом случае PackId
в результирующем наборе обнуляется введите (возможно int?
) и для некоторых результирующих элементов будет ноль.
Совет: Синтаксис запроса в таких случаях намного проще:
var allCustomer =
(from customer in customers
join package in packages on customer.PackId equals package.PackId into g
from package in g.DefaultIfEmpty()
select new { CustId = customer.CustomerId, PackId = package?.PackId })
.ToList();
Еще одно примечание: Если вы напишите такой запрос к IQueryable
коллекциям, поступающим из ORM (Entity Framework, например), вы не получите NullReferenceException
. Потому что ваш запрос переведен на SQL и запущен в вашей СУБД.