gpt4 book ai didi

c# - Linq 查询 nhibernate;不支持异常

转载 作者:太空宇宙 更新时间:2023-11-03 22:05:10 25 4
gpt4 key购买 nike

我是 nHibernate 的新手,来自 EF 背景,我正在努力处理以下查询:

_patientSearchResultModel = (from patient in _patientRepository.Query(patientSearch.BuildPatientSpecification())
join admission in _admissionRepository.Query(patientSearch.BuildAdmissionSpecification())
on patient.Id equals admission.Patient.Id
orderby admission.AdmissionDate
select new PatientSearchResultModel(patient.Id,
admission.Id,
false,
_phaseTypeMapper.GetPhaseTypeModel(admission.PhaseType),
patient.Last, patient.First,
admission.InPatientLocation,
admission.AdmissionDate,
admission.DischargeDate,
admission.RRI,
null,
admission.CompletionStatus,
admission.FollowupStatus)).ToList();

此查询的目的是允许用户过滤使用两个 Build???Specification 函数构建的参数的两个查询并返回结果集。可能有很多入院记录,我只希望每个患者对象有一个 PatientSearchResultModel,入院对象是入院日期前最新的一个。

这些对象来自 nHibernate,它一直返回一个 Not Supported 异常。因此 Patient 和 Admissions 之间也存在关联:Patient.Admissions 但我不知道如何添加从函数 Build???Specifications 返回的查询过滤器。

如果有人能指出正确的方向,我将不胜感激;我是否反对 nHibernate 中的 Linq 提供程序实现,需要移动到 Criteria 还是我的 Linq 查询?

如果有人对此领域的好书或其他学习 Material 有任何链接或建议,那也会非常有帮助。

最佳答案

我看到了几个潜在的问题:

  1. 如果您使用的是 NHibernate 2.x + Linq2NHibernate,则不支持这样的显式连接;在其他版本中,它们只是被认为是一种气味。
  2. 我认为 NHibernate 不支持在 select 子句中调用参数化构造函数
  3. 我非常确定 NHibernate 不支持在 select lambda 中调用实例方法

我建议使用 lambda 语法和 SelectMany以减轻潜在的连接问题。第 2 点和第 3 点可以通过投影到匿名类型来解决,调用 AsEnumerable然后投影到您的模型类型中。
总的来说,我建议像这样重构您的代码:

var patientSpec = patientSearch.BuildPatientSpecification();
var admissionSpec = patientSearch.BuildAdmissionSpecification();
_patientSearchResultModel = _patientRepository.Where(patientSpec)
.SelectMany(p=>p.Admissions).Where(admissionSpec)
.Select(a=> new {
PatientId = a.Patient.Id,
AdminssionId = a.Id,
a.PhaseType,
a.Patient.Last,
a.Patient.First,
a.InPatientLocation,
a.AdmissionDate,
a.DischargeDate,
a.RRI,
a.CompletionStatus,
a.FollowupStatus
}).AsEnumerable()
.Select(x=> new PatientSearchResultModel(x.PatientId, x.AdmissionId ...))
.ToList();

关于c# - Linq 查询 nhibernate;不支持异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8703771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com