В чем причина, потому что у меня нулевая ошибка? LINQ LeftJoin Проблемы - PullRequest
0 голосов
/ 26 марта 2020
var allCustomers = customers.GroupJoin(packages,
    customers => customers.PackId,
    packages => packages.PackId,
    (customers, packages) => new { customers, packages })
    .SelectMany(y => y.packages.DefaultIfEmpty(),
    (x, y) => new { CustId = x.customers.CustomerId, PackId = y.PackId }).ToList();

Я пытался выполнить операцию левого соединения, но безуспешно

1 Ответ

0 голосов
/ 26 марта 2020

Посмотрите на звонок 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 и запущен в вашей СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...