LinQ的多个左联接和内联接

时间:2020-07-14 17:29:24

标签: c# sql linq

我有这个可以工作的SQL代码:

from starlette.middleware.base import BaseHTTPMiddleware


class CheckApiKey(BaseHTTPMiddleware):
 async def dispatch(self, request, call_next):
    print("ok")
    response = await call_next(request)

    return response

有两个左联接和一个内联接。我知道如何进行内部联接,但不知道如何使两个左联接需要在第一个内部联接中获得ID。我正在做这样的事情:

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

内部联接的工作正常,但是我不知道如何翻译两个左联接,有什么建议吗?

1 个答案:

答案 0 :(得分:1)

根据Microsoft documentation,查询将为:

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();

希望您对此有帮助。

相关问题