Необязательное условие в предложении соединения - Linq - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть запрос ниже linq

 var resultGuardian = from s in _db.Students
     join sg in _db.StudentGuardians on s.StudentID equals sg.StudentID
     join g in _db.Guardians on sg.GuardianId equals g.GuardianId
     join lr in _db.luRelationTypes on sg.RelationTypeID equals lr.RelationTypeID
     join ga in _db.GuardianAddresses on g.GuardianId equals ga.GuardianId
     join ad in _db.Addresses on ga.AddressID equals ad.AddressID
     join lt in _db.luAddressTypes on ad.AddressTypeID equals lt.AddressTypeID
     join lg in _db.luGenders on g.GenderID equals (int?)lg.GenderID into ssts
     from gdnr in ssts.DefaultIfEmpty()
     where
         s.TenantID == tenantid && sg.TenantID == tenantid && g.TenantID == tenantid &&
         s.StatusId == (int?)Extension.StatusType.Active //1
         && g.StatusID == (int?)Extension.StatusType.Active &&
         lr.StatusID == (int?)Extension.StatusType.Active && lr.TenantID == tenantid &&
         s.StudentID == sid
     select new
     {
         g.FirstName,
         g.LastName,
         IsPrimary = sg.IsPrimaryGuardian,
         g.Education,
         g.Email,
         g.Phone,
         lr.RelationCD,
         ga.IsStudentAddress,
         gdnr.GenderCD,
         lt.AddressName,
         ad.Address1,
         ad.Address2,
         ad.City,
         ad.State,
         ad.Zipcode

     };

В приведенном выше запросе, когда ad.AddressTypeID равно null, он не возвращает никакого результата.

У меня есть требование, если ad.AddressTypeID равноnull, чем из LuAddressTypes извлечь запись по умолчанию, где AddressTypeCd=1.Если я попытаюсь таким образом

join lt in LuAddressTypes on ad.AddressTypeID equals lt.AddressTypeID into v1
from v2 in v1.DefaultIfEmpty()
select new
     {      
         v2.AddressName,
         g.Phone,..

     });

в результате v2.AddressName всегда возвращая null.Я также не могу указать условие AddressTypeCd=1 where.AddressTypeCd=1 не ad.AddressTypeID.

Мне нужно v2.AddressName, где AddressTypeCd=1.Как я могу это сделать?Найти связанные объекты все связанные объекты

1 Ответ

0 голосов
/ 22 ноября 2018

Вы не можете использовать стандарт LINQ join, но в LINQ to Entities вы можете использовать альтернативный синтаксис объединения, основанный на коррелированном Where - EF достаточно умен, чтобы перевести его на JOIN.

В вашем случае вместо

join lt in _db.luAddressTypes on ad.AddressTypeID equals lt.AddressTypeID

вы можете использовать

from lt in _db.luAddressTypes.Where(lt => ad.AddressTypeID == lt.AddressTypeID
    || (ad.AddressTypeID == null && lt.AddressTypeCd == 1))

, что в переводе на что-то вроде этого

INNER JOIN [dbo].[LuAddressTypes] AS [Extent3]
    ON ([Extent2].[AddressTypeID] = [Extent3].[AddressTypeID])
        OR (([Extent2].[AddressTypeID] IS NULL) AND (1 = [Extent3].[AddressTypeCd]))

Если вы хотите LEFT OUTER JOIN, просто добавьте .DefaultIfEmpty() в конце строки выше.

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