2017-07-31 1 views
0

J'utilise couramment API et Ef Core.Entity Framework Core - (Type de sous-requête)

Ceci est mon LINQ:

var data = (from candidateHP in _cempContexto.CandidateHiringProcessSummary 
       join jobsHP in _cempContexto.JobHiringProcessSummary on candidateHP.JobCode equals jobsHP.JobCode 
       join job in _cempContexto.Vaga on jobsHP.JobCode equals job.Codigo 
       join candidateJob in _cempContexto.TrCandidatoVaga on new { X = job.Codigo, Y = candidateCode } equals new { X = candidateJob.VagaCodigo, Y = candidateJob.CandidatoCodigo } 
       where 
       candidateHP.CandidateCode == candidateCode 
       select 
       new 
       { 
       JobCode = jobsHP.JobCode, 
       CompanyCode = job.EmpresaCodigo, 
       Title = job.Titulo, 
       HasImage = true, 
       CompanyName = job.NomeEmpresa, 
       QuantityJobs = job.QuantidadeVaga, 
       Location = job.CidadeCodigo, 
       QuantityResumeSent = jobsHP.QuantityResumeSent, 
       JobStatusCode = jobsHP.StatusCode, 
       CandidateStatusCode = candidateHP.StatusCode, 
       StatusCode = job.StatusCodigo, 
       ResumeSentDate = candidateJob.Data, 
       InsertDate = job.DataDeCadastro, 
       EndDate = job.DataDeSaida, 
       city= _cempContexto.TrVagaCidade.SelectMany(p => _cempContexto.TrVagaCidade.Where(q => q.VagaCodigo == candidateHP.JobCode).Select(q => new { q })).ToList() 
       }) 
       .ToList(); 

Je dois remplir la ville avec cette sous-requête. J'ai besoin d'un meilleur moyen de le faire, Comment pourrais-je procéder?

+0

Étape 1 est de se débarrasser de cette horrible type anonyme et la transformer en une classe. – stybl

+0

Pourquoi n'y a-t-il aucune propriété de navigation dans votre modèle? Toutes vos requêtes seraient beaucoup plus simples si vous les aviez. –

+0

Quel est le '.Select 'supplémentaire à la fin? – NetMage

Répondre

0

code Divisé en deux requêtes:

var query = (from candidateHP in _cempContexto.CandidateHiringProcessSummary 
       join jobsHP in _cempContexto.JobHiringProcessSummary on candidateHP.JobCode equals jobsHP.JobCode 
       join job in _cempContexto.Vaga on jobsHP.JobCode equals job.Codigo 
       join candidateJob in _cempContexto.TrCandidatoVaga on new { X = job.Codigo, Y = candidateCode } equals new { X = candidateJob.VagaCodigo, Y = candidateJob.CandidatoCodigo } 
       where 
       candidateHP.CandidateCode == candidateCode 
       select 
       new 
       { jobsHP = jobsHP, job = job, candidateJob = candidateJob}).ToList(); 

var data = query.Select(x => new { 
       JobCode = x.jobsHP.JobCode, 
       CompanyCode = x.job.EmpresaCodigo, 
       Title = x.job.Titulo, 
       HasImage = true, 
       CompanyName = x.job.NomeEmpresa, 
       QuantityJobs = x.job.QuantidadeVaga, 
       Location = x.job.CidadeCodigo, 
       QuantityResumeSent = x.jobsHP.QuantityResumeSent, 
       JobStatusCode = x.jobsHP.StatusCode, 
       CandidateStatusCode = x.candidateHP.StatusCode, 
       StatusCode = x.job.StatusCodigo, 
       ResumeSentDate = x.candidateJob.Data, 
       InsertDate = x.job.DataDeCadastro, 
       EndDate = x.job.DataDeSaida, 
       city= query.Select(y => y.candidateHP.JobCode).Select(q => new { q })).ToList() 
       }) 
       .ToList(); 
+0

-> Je l'ai fait d'une manière différente: je mets un for-each, et le –

+0

@jdeweng - > Oui, votre code est correct, mais pas impressionnant, j'imagine que j'ai obtenu ce résultat en une seule requête, à cause de votre façon d'ouvrir et de fermer la connexion pour e toute rangée dans une liste de contenu. – jdweng

+0

Il n'est pas évident dans le code où la connexion s'ouvre et se ferme. – jdweng