Левое внешнее соединение не соблюдается - PullRequest
1 голос
/ 03 июля 2019

У нас есть следующий код EF:

    var qry =
            from c in db.Contacts

            join comp in db.Companies on c.CompanyId equals comp.CompanyId
                into compLeft
            from cj in compLeft.DefaultIfEmpty()

            select new CompleteUserDlModel
            {
                CompanyName = cj.Company1,
                CompanyId = c.CompanyId
            };

, который генерирует этот SQL

SELECT 
    [Extent1].[CompanyId] AS [CompanyId], 
    [Extent2].[Company] AS [Company]
    FROM  [dbo].[Contacts] AS [Extent1]
    INNER JOIN [dbo].[Company] AS [Extent2] ON [Extent1].[CompanyId] = [Extent2].[CompanyId]

но мы на самом деле хотим

SELECT 
    [Extent1].[CompanyId] AS [CompanyId], 
    [Extent2].[Company] AS [Company]
    FROM  [dbo].[Contacts] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Company] AS [Extent2] ON [Extent1].[CompanyId] = [Extent2].[CompanyId]

Может кто-нибудь указать, что мы сделали неправильно, пожалуйста?

Все ссылки на левые внешние соединения в C # EF (т.е. LEFT OUTER JOIN в LINQ ) указывают на используемый нами синтаксис. Ясно, что мы что-то упускаем.

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Может кто-нибудь указать, что мы сделали не так, пожалуйста?

Возможно, вы набрали Contact.CompanyId с типом int вместо int?, что делает его обязательным свойством, и поэтому EF предполагает, что у вас есть ссылочная целостность при генерации запроса.

Но, как всегда, left join в LINQ имеет неприятный запах кода, и его почти всегда можно заменить, просто запросив целевую сущность и пройдя по ее навигационным свойствам. EG:

 from c in db.Contacts
 select new
 {
     CompanyName = c.CompanyId.HasValue?c.Company.CompanyName : null,
     CompanyId = c.CompanyId
 };
0 голосов
/ 03 июля 2019
var qry =
            from c in db.Contacts

            join comp in db.Companies on c.CompanyId equals comp.CompanyId
                into compLeft
            from cj in compLeft.DefaultIfEmpty()

            select new CompleteUserDlModel
            {
                CompanyName = cj.Company1,
                CompanyId = c?.CompanyId ?? String.Empty
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...