Home > other >  Querying in Entity Framework
Querying in Entity Framework

Time:01-14

I need to translate that query to Entity Framework, can someone help me ?

select distinct
    rap.AtracacaoData Atracacao,
    loc.Nome_Local Local,
    nav.Nome Navio,
    nav.Navio_ID ViagemNavio,
    'DT ' TransferenciaTipo,
    edt.Numero TransferenciaNumero,
    loct.Local Terminal
from 
    terminal..blalf bl (nolock)
inner join 
    terminal..navios nav (nolock) on nav.navio_id = bl.navio
inner join 
    terminal..avisochegada rap (nolock) on rap.Numero_Viagem_Ano = nav.Viagem_Ano_AVC
inner join 
    terminal..localatracalf loc (nolock) on loc.codigo_local = rap.armazem
inner join 
    tresos..vw_autorizacaorecebimento_navio autnav (nolock) on autnav.viagemnavio = nav.navio_id
                                                            and autnav.tipo = 2
inner join 
    tresos..edt edt (nolock) on edt.ID = autnav.DeclaracaoTransitoEntrada
inner join 
    tresos..localidades loct (nolock) on loct.ID = bl.terminal

union

select distinct
    rap.AtracacaoData Atracacao,
    loc.Nome_Local Local,
    nav.Nome Navio,
    nav.Navio_ID ViagemNavio,
    'DTA ' TranferenciaTipo,
    edt.Numero TransferenciaNumero,
    loct.Local Terminal
from 
    terminal..blalf bl (nolock)
inner join 
    terminal..navios nav (nolock) on nav.navio_id = bl.navio
inner join 
    terminal..avisochegada rap (nolock) on rap.Numero_Viagem_Ano = nav.Viagem_Ano_AVC
inner join 
    terminal..localatracalf loc (nolock) on loc.codigo_local = rap.armazem
inner join 
    tresos..vw_autorizacaorecebimento_navio autnav (nolock) on autnav.viagemnavio = nav.navio_id
                                                            and autnav.tipo = 3
inner join 
    tresos..edta edt (nolock) on edt.ID = autnav.DeclaracaoTransitoEntrada
inner join 
    tresos..localidades loct (nolock) on loct.ID = bl.terminal

union

select distinct
    rap.AtracacaoData Atracacao,
    loc.Nome_Local Local,
    nav.Nome Navio,
    nav.Navio_ID ViagemNavio,
    'PCI ' TranferenciaTipo,
    edt.Numero TransferenciaNumero,
    loct.Local Terminal
from
    terminal..blalf bl (nolock)
inner join 
    terminal..navios nav (nolock) on nav.navio_id = bl.navio
inner join 
    terminal..avisochegada rap (nolock) on rap.Numero_Viagem_Ano = nav.Viagem_Ano_AVC
inner join 
    terminal..localatracalf loc (nolock) on loc.codigo_local = rap.armazem
inner join 
    tresos..vw_autorizacaorecebimento_navio autnav (nolock) on autnav.viagemnavio = nav.navio_id
                                                            and autnav.tipo = 4
inner join 
    tresos..eprc edt (nolock) on edt.ID = autnav.DeclaracaoTransitoEntrada
inner join 
    tresos..localidades loct (nolock) on loct.ID = bl.terminal

I tried to do but I couldn't do it.

CodePudding user response:

First, you need an Entity Framework model that maps to your SQL structure. Hopefully you already have that. I'm assuming you do.

Second, you should create a DTO that has the properties your query will return:


public class ASensibleNameInYourDomain {

   public ? Atracaco {get; set;}
   public string Local {get; set;}
   ...
}

Third, you write a function that takes your EF DbContext and the query params, and returns a list of your DTO. It looks like your SQL is the same query repeated so I'd do:

public List<ASensibleNameInYourDomain> LoadFlightInfo(DbContext context, int autNavTipo, string transfericaTipo) {
   return context.Blalf.Select(blaf=> 
            new ASensibleNameInYourDomain {
                Atracacao=blaf.Navios.Avisochegada.AtracacaoData,
                Local=blaf.Navios.Avisochegada.Localatracalf.Nome_Local,
                Navio=blaf.Navios.Nome,
                ViagemNavio=blaf.Navios.Navio_ID,
                TransferenciaTipo=transfericaTipo,
                TransferenciaNumero=blaf.Navios.Autorizacaorecebimento_navio.Numero,
                Terminal=blaf.Localidades.Local
            }
        ).Where(blaf=> blaf.Navios.Autorizacaorecebimento_navio.Tipo == autNavTipo)
        .Distinct()
        .ToList()
}

And then call it like so


public List<ASensibleNameInYourDomain> GetFlights(DbContext context) {
    var result = LoadFlightInfo(context, 2, "DT");
    result.addRange(LoadFlightInfo(context, 3, "DTA"));
    result.addRange(LoadFlightInfo(context, 4, "PCI"));
    
    return result
}

I think that'll do it, been a while since I did any C#...

  • Related