Множественное левое соединение и внутреннее соединение с LinQ - PullRequest
0 голосов
/ 14 июля 2020

У меня есть этот SQL код, который работает:

SELECT 
    FF.numero, 
    FF.cuo_pla, 
    FF.num_pla,
    PN.Descripcion,
    TN.Nombre
FROM encf EF
JOIN forf FF
    ON EF.numero = FF.numero 
    AND EF.[manual] = FF.[manual]
    AND EF.comproba = FF.comproba
    AND EF.tipo_fac = FF.tipo_fac
    AND EF.sucursal = FF.sucursal
LEFT JOIN Planes PN
    ON FF.num_pla = PN.Numero
LEFT JOIN Tarjetas TN
    ON PN.IdTarjeta = TN.ID
WHERE 
    EF.documento = 123456789

Есть два LEFT JOIN и одно INNER JOIN. Я знаю, как выполнить внутреннее соединение, но не знаю, как сделать эти два левых соединения, которым нужен идентификатор, полученный в первом внутреннем соединении. Я делаю что-то вроде этого:

var queryEncFor = from enc in db.encf
                              join forF in db.forf on
                                new
                                {
                                    JoinProperty1 = enc.numero,
                                    JoinProperty2 = enc.manual,
                                    JoinProperty3 = enc.comproba,
                                    JoinProperty4 = enc.tipo_fac,
                                    JoinProperty5 = enc.sucursal
                                }
                                equals
                                new
                                {
                                    JoinProperty1 = forFact.numero,
                                    JoinProperty2 = forFact.manual,
                                    JoinProperty3 = forFact.comproba,
                                    JoinProperty4 = forFact.tipo_fac,
                                    JoinProperty5 = forFact.sucursal
                                }
                              where enc.documento == doc
                              select new UnionEncForFact
                              {
                                  numero = enc.numero,
                                  cuo_pla = forF.cuo_pla == null ? 0 : forF.cuo_pla.Value,
                                  num_pla = forF.num_pla
                              };

Внутреннее соединение работает, но я не знаю, как перевести два левых соединения, какие-либо предложения?

1 Ответ

1 голос
/ 14 июля 2020

Согласно документации Microsoft , запрос будет выглядеть следующим образом:

var queryEncFor = (from enc in db.encf
                   join forF in db.forf on
                   new
                   {
                       enc.numero,
                       enc.manual,
                       enc.comproba,
                       enc.tipo_fac,
                       enc.sucursal
                   }
                   equals
                   new
                   {
                       forF.numero,
                       forF.manual,
                       forF.comproba,
                       forF.tipo_fac,
                       forF.sucursal
                   }
                   join plane in db.Planes on forF.num_pla equals plane.Numero into leftedPlanes
                   from leftedPlane in leftedPlanes.DefaultIfEmpty()

                   join tarjeta in db.Tarjetas on leftedPlane?.IdTarjeta equals tarjeta.ID into leftedTarjetas
                   from leftedTarjeta in leftedTarjetas.DefaultIfEmpty()

                   where enc.documento == 1
                   select new UnionEncForFact
                   {
                       numero = enc.numero,
                       cuo_pla = forF.cuo_pla == null ? 0 : forF.cuo_pla.Value,
                       num_pla = forF.num_pla,
                       Descripcion = leftedPlane?.Descripcion,
                       Nombre = leftedTarjeta?.Nombre ?? 0
                   }).ToList();

Надеюсь, вы найдете это полезным.

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