You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:18:02