C# 1对1关联场景下选中患者行后在新GridView展示对应病历的问题
问题根源
你新增的Where过滤条件q => q.C_PatientID == q.Patient.PatientID对所有合法关联的病历记录都恒成立——因为C_PatientID本身就是病历表关联患者表主键的外键,该条件没有引入外部的选中患者ID作为过滤基准,相当于没有加过滤规则,所以查询结果还是所有患者的病历数据。
调整方案
第一步:改造查询逻辑,支持传入选中患者ID过滤
修改PopulateGrid方法,增加可选的患者ID参数,根据参数是否存在决定是否加过滤条件:
private void PopulateGrid(int? selectedPatientId = null) { // 基础查询 var query = _db.GeneralMedicalHistories.AsQueryable(); // 传入了选中的患者ID时,添加过滤条件 if (selectedPatientId.HasValue) { query = query.Where(q => q.C_PatientID == selectedPatientId.Value); } // 映射查询结果 var records = query.Select(q => new { PatientNumber = q.GeneralMedicalHistoryID, MaritalStatus = q.MartialStatus, Education = q.Education, BloodType = q.BloodType, Pregenancies = q.Pregnancies, Tobacco = q.Tobacco, Alcohol = q.Alcohol, Drug = q.Drug, MedicalHistoryNotes = q.MedicalHistoryNotes, }).ToList(); // 绑定表格 gvDemographics.DataSource = records; gvDemographics.Columns["PatientNumber"].HeaderText = "Patient#"; gvDemographics.Columns["MaritalStatus"].HeaderText = "Marital Status"; gvDemographics.Columns["BloodType"].HeaderText = "Blood Type"; gvDemographics.Columns["MedicalHistoryNotes"].HeaderText = "Medical History Notes"; gvDemographics.Columns["PatientNumber"].Visible = true; }
第二步:适配调用逻辑
- 应用启动需要展示全部病历数据时,直接调用无参的
PopulateGrid()即可 - 选中患者后点击查询按钮的事件中,先从患者列表的选中行获取对应患者的主键
PatientID,再将该ID作为参数传入PopulateGrid方法调用,示例逻辑如下:
// 查询按钮点击事件逻辑 private void btnQueryMedicalHistory_Click(object sender, EventArgs e) { // 从患者列表选中行取PatientID,此处控件名请替换为你实际使用的患者列表控件名 if (gvPatientList.SelectedRows.Count == 0) return; int selectedPatientId = (int)gvPatientList.SelectedRows[0].Cells["PatientID"].Value; // 调用方法过滤查询 PopulateGrid(selectedPatientId); }
注意事项
需确认患者列表中取出的PatientID字段类型和病历表C_PatientID字段类型完全匹配,避免类型转换或值匹配失败导致过滤失效。
内容的提问来源于stack exchange,提问作者MoAl
相关产品推荐
相关产品推荐

