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#...