Запрос LEFT JOIN с Entity Framework Core - PullRequest
0 голосов
/ 12 июня 2018

Я провел много исследований и прочитал некоторые подобные вопросы и ответы, но все еще не знаю, как написать код EF Core для создания следующего запроса SQL-сервера.Может кто-нибудь помочь.Я видел учебные пособия, объясняющие, как объединить 2 таблицы с помощью LEFT JOIN, но не смог найти ни одну, включающую 3 или более таблиц.

SELECT std.DocID, std.ServiceCode, 
    CASE std.Description
        WHEN 'Car Wash' 
        THEN 'Misc' 
        ELSE std.Description 
    END AS 'Description', 
    std.StandardRate, std.StandardHours,
    det.ParticipantCount, det.TotalHours, det.TotalFees
FROM StandardServices std 
INNER JOIN Sorted srt 
    ON std.ServiceCode = srt.ServiceCode 
LEFT OUTER JOIN ServiceDetails det
    ON det.ParentRecordUNID='00000000-0000-0000-0000-000000000000' AND det.ServiceTypeUNID=std.DocID
WHERE std.IsDeleted='N' AND std.TopService = 'Y' 
ORDER BY srt.SortOrder

Ниже приведено то, что было близко к описанному выше (я заменил некоторый текстпо соображениям конфиденциальности, поэтому может не совсем совпадать).Но по ряду причин он выбирает все столбцы, кроме упомянутых.Кроме того, он добавляет (ВЫБРАТЬ 1) в конце.

    var results=await (from sso in context.StandardServices
                       join mos in context.Sorted on sso.ServiceCode equals mos.ServiceCode
                       join mad in context.ServiceDetails
                       on new { key1 = sso.DocID, key2 = parentId } equals new { key1 = (Guid)mad.ServiceTypeUnid, key2 = mad.ParentRecordUnid }
                                                      into jointable
                         where sso.IsDeleted == "N" && sso.TopService =="Y" 
                         orderby mos.SortOrder
                         from mad1 in jointable.DefaultIfEmpty()
                         select new ServiceRowDetails()
                         {
                             DocID = mad1.DocID,
                             ParentRecordUnid = mad1.ParentRecordUnid,
                             ServiceTypeUnid = sso.DocID,
                             ServiceType = sso.Description,
                             ParticipantCount = mad1.ParticipantCount ?? 0,
                             StandardFees = sso.StandardRate ?? 0,
                             StandardHours = sso.StandardHours ?? 0,
                             TotalFees = mad1.TotalFees ?? 0,
                             TotalHours = mad1.TotalHours ?? 0
                         }).ToListAsync();

ОБНОВЛЕНИЕ: Внесены изменения, как @IvanStoev прокомментировал ниже, и он работал просто отлично.

    var results=await (from sso in context.StandardServices
                           join mos in context.Sorted on sso.ServiceCode equals mos.ServiceCode
                           join mad in context.ServiceDetails
                           on new { key1 = sso.DocID, key2 = parentId } equals new { key1 = (Guid)mad.ServiceTypeUnid, key2 = mad.ParentRecordUnid }
                                                          into jointable
 from mad1 in jointable.DefaultIfEmpty()
                             where sso.IsDeleted == "N" && sso.TopService =="Y" 
                             orderby mos.SortOrder

                             select new ServiceRowDetails()
                             {
                                 DocID = mad1.DocID,
                                 ParentRecordUnid = mad1.ParentRecordUnid,
                                 ServiceTypeUnid = sso.DocID,
                                 ServiceType = sso.Description,
                                 ParticipantCount = mad1.ParticipantCount ?? 0,
                                 StandardFees = sso.StandardRate ?? 0,
                                 StandardHours = sso.StandardHours ?? 0,
                                 TotalFees = mad1.TotalFees ?? 0,
                                 TotalHours = mad1.TotalHours ?? 0
                             }).ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...