使用Lambda连接多表并拼接字段绑定DataGridView问题求助
问题解决与优化方案
当前问题修复
你拼接BusinessPartner全名的方式有误,Concat方法用于拼接字符串序列,并非单个字符串的拼接逻辑。正确的字符串拼接方式如下:
修改查询中的全名拼接部分,同时给拼接后的字段命名(方便DataGridView绑定):
var result = (from evidence in listEvidence join detail in listDetail on evidence.Id equals detail.EvidenceId join countryname in listCountry on evidence.CountryId equals countryname.Id join partner in listPartner on evidence.PartnerId equals partner.Id select new { evidence.TruckNo, evidence.SerialNo, evidence.Date, // 正确拼接全名,处理空值避免出现无效字符串 FullName = $"{partner.Name ?? ""} {partner.Familly ?? ""}".Trim(), detail.Id, detail.EvidenceId, detail.MerchandiseName, detail.weight, detail.Unit, detail.Discription, countryname.CountryName }).ToList();
同时确保你的DataGridView列的DataPropertyName设置为FullName,因为AutoGenerateColumns设为false,需要手动绑定对应字段。
更优实现方案
当前代码先把所有表的数据加载到内存再做关联,数据量大时会占用过多内存且效率低下。建议直接利用EF的IQueryable特性,让数据库层面执行关联和计算,只返回需要的数据:
优化后的查询代码
// 直接通过DbSet构建查询,不提前加载全表数据 var result = (from evidence in db.Evidence join detail in db.EvidenceDetail on evidence.Id equals detail.EvidenceId join countryname in db.Country on evidence.CountryId equals countryname.Id join partner in db.BusinessPartners on evidence.PartnerId equals partner.Id select new { evidence.TruckNo, evidence.SerialNo, evidence.Date, FullName = $"{partner.Name ?? ""} {partner.Familly ?? ""}".Trim(), detail.Id, detail.EvidenceId, detail.MerchandiseName, detail.weight, detail.Unit, detail.Discription, countryname.CountryName }).ToList(); dgEvidenceList.AutoGenerateColumns = false; dgEvidenceList.DataSource = result;
优势说明
- 减少内存占用:仅查询和返回需要的字段,而非全表数据
- 提升性能:关联和字符串拼接逻辑在数据库层面执行,比内存中处理更快
- 简化代码:无需调用
Get()/GetAllPartners()提前加载数据
内容的提问来源于stack exchange,提问作者abbas
相关产品推荐
相关产品推荐

