C# LINQ查询数据库事件列表时如何通过patientId获取对应patientName
错误原因
原代码中db.Patients.Where(p => p.PatientId == m.PatientIdFk).Select(p => p.PatientName)返回的是IQueryable<string>集合类型,直接调用ToString()不会返回患者姓名,只会返回该类型的全类名字符串,同时EF在转换该嵌套查询为SQL时也会抛出不支持该操作的运行时异常。
修改方案1:使用Join关联查询(推荐,性能最优)
直接在查询阶段关联PTSessions和Patients表,一次查询拿到所有需要的字段,避免多次查询数据库:
events = db.PTSessions .Where(x => x.OfficeIdFk == user.OfficeIdFk || x.PTIdFk == user.PTId) .Where(a => a.AppointmentDate > start && a.AppointmentTimeTo < end) // 关联患者表 .Join(db.Patients, session => session.PatientIdFk, patient => patient.PatientId, (session, patient) => new { session, patient }) .Select(m => new EventViewModel { id = m.session.SessionId, title = m.session.AppointmentReason, start = m.session.AppointmentTimeFrom, end = m.session.AppointmentTimeTo, allDay = false, patientid = m.session.PatientIdFk, appointmentstatus = m.session.AppointmentStatus, patientname = m.patient.PatientName }).ToList();
修改方案2:直接取单条患者数据的姓名字段
如果表结构保证PatientId是唯一主键,也可以直接调整patientname的赋值逻辑,取第一条匹配的结果:
// 基础写法,PatientId存在时有效 patientname = db.Patients.FirstOrDefault(p => p.PatientId == m.PatientIdFk).PatientName // 兼容空值写法,避免患者ID不存在时触发空引用异常 patientname = db.Patients.Where(p => p.PatientId == m.PatientIdFk).Select(p => p.PatientName).FirstOrDefault() ?? "未知患者"
补充:如果实体配置了导航属性
如果你的PTSessions实体类已经定义了指向Patients的导航属性,比如:
public class PTSessions { // 其他字段省略 public int PatientIdFk { get; set; } public Patients Patient { get; set; } }
代码可以更简洁:
events = db.PTSessions .Include(x => x.Patient) // 预先加载关联的患者数据 .Where(x => x.OfficeIdFk == user.OfficeIdFk || x.PTIdFk == user.PTId) .Where(a => a.AppointmentDate > start && a.AppointmentTimeTo < end) .Select(m => new EventViewModel { id = m.SessionId, title = m.AppointmentReason, start = m.AppointmentTimeFrom, end = m.AppointmentTimeTo, allDay = false, patientid = m.PatientIdFk, appointmentstatus = m.AppointmentStatus, patientname = m.Patient.PatientName }).ToList();
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

