i ont donc une requête suivante dans le noyau ef, qui se traduit par des résultats en double, même im difficile d'appeler d'abord ou par défaut sur elleEntity Framework de base - Tout d'abord le retour des résultats en double après la migration vers noyau .net
DateTime maxDate = SqlDateTime.MaxValue.Value;
var results = (from r in _dbContext.audit_Results
join e in _dbContext.audit_DataEncounters on new { r.IdAudit, r.PatientFirstName, r.PatientLastName, r.PatientDOB } equals new { e.IdAudit, PatientFirstName = e.FirstName, PatientLastName = e.LastName, PatientDOB = e.DateOfBirth } into eJoin
let e = eJoin.Where(it => it.StartDate <= r.TransactionDate && r.TransactionDate <= (it.EndDate ?? maxDate))
.OrderBy(it => it.Inpatient).OrderByDescending(it => it.StartDate)
.FirstOrDefault()
where r.IdAudit == idAudit && r.PatientFirstName == "ERIC" && r.PatientLastName == "BROOKS"
select new AuditResultBulkModel()
{
IdResult = r.IdResult,
map_HasPatient = eJoin.Any(),
map_IdEncounter = e != null ? e.IdEncounter : (int?)null
}).ToList();
Le produit la requête ressemble à ceci:
SELECT *
FROM [audit_Results] AS [r]
LEFT JOIN [audit_DataEncounters] AS [e] ON ((([r].[IdAudit] = [e].[IdAudit]) AND (([r].[PatientFirstName] = [e].[FirstName]) OR ([r].[PatientFirstName] IS NULL AND [e].[FirstName] IS NULL))) AND (([r].[PatientLastName] = [e].[LastName]) OR ([r].[PatientLastName] IS NULL AND [e].[LastName] IS NULL))) AND (([r].[PatientDOB] = [e].[DateOfBirth]) OR ([r].[PatientDOB] IS NULL AND [e].[DateOfBirth] IS NULL))
WHERE (([r].[IdAudit] = @__idAudit_1)
ORDER BY [r].[IdAudit], [r].[PatientFirstName], [r].[PatientLastName], [r].[PatientDOB]
Quelqu'un peut-il me dire comment obtenir les bons résultats?
Dans le passé (Entity Framework dans .net Framework) - utilisé pour produire des résultats non dupliqués à l'aide de OUTER APPLY.
Editer: La version My EF Core est 2.0.0.
modèle de données est la suivante:
public class audit_Result
{
[Key]
public int IdResult { get; set; }
public int IdAudit { get; set; }
public bool? map_HasPatient { get; set; }
public int? map_IdEncounter { get; set; }
public virtual audit_Audit audit_Audit { get; set; }
}
public class audit_DataEncounter: IAuditEntity
{
[Key]
public int IdEncounter { get; set; }
public int IdAudit { get; set; }
[StringLength(50)]
public string FirstName { get; set; }
[StringLength(50)]
public string LastName { get; set; }
public DateTime? DateOfBirth { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool? Inpatient { get; set; }
public virtual audit_Audit Audit { get; set; }
}
public class audit_Audit
{
[Key]
public int IdAudit { get; set; }
public virtual ICollection<audit_DataEncounter> audit_DataEncounters { get; set; }
public virtual ICollection<audit_Result> audit_Result { get; set; }
}
Si vous obtenez des doublons indésirables ne pourriez-vous pas simplement les supprimer en utilisant distinct? Jetez un oeil à cet article: https://stackoverflow.com/questions/4539668/entity-framework-select-distinct-name – BastianBuhrkall
Veuillez afficher le modèle d'entité utilisé dans la requête. Spécifiez également la version EF Core. –
@IvanStoev j'ai ajouté mon modèle de données –