Entity Framework中使用Linq拼接子表字段为逗号分隔字符串问题
问题原因
报错的根本原因是:你写的Linq查询属于IQueryable类型,EF需要将其翻译为SQL语句在数据库端执行,但String.Join方法没有对应SQL原生实现,因此EF无法完成转换,就抛出了该异常。你把属性改成List<string>可以正常运行,是因为EF可以把集合查询翻译为对应的SQL子查询,返回集合后在内存中加载。
解决方案
不要在数据库查询的投影阶段执行字符串拼接,先把所需数据(包括供应商零件名的集合)加载到内存后,再用String.Join处理拼接逻辑,不需要修改原有查询的关联结构,符合你的要求,代码示例如下:
// 第一步:先从数据库查询所需数据,仅做字段映射,不执行String.Join,此时EF可以正常翻译 var tempResult = (from p in DBContext.Parts.Where(w => w.EquipmentId == eId) select new { Id = p.Id, Number = p.PartNumber, // 保留原有的子查询逻辑,先查询出零件对应的所有供应商零件名集合 VendorPartNameList = DBContext.VendorPartName.Where(w => w.PartId == p.Id).Select(s => s.PartName) }) // 调用AsEnumerable()切换到内存查询,后续操作不再需要转换为SQL .AsEnumerable(); // 第二步:在内存中处理字符串拼接,生成最终的PartModel集合 var result = tempResult.Select(t => new PartModel { Id = t.Id, Number = t.Number, // 内存操作可以正常使用String.Join VendorPartNames = String.Join(", ", t.VendorPartNameList) }).ToList();
补充说明:如果你使用的是EF Core 3.0及以上版本,新版本EF已经支持将String.Join翻译为对应数据库的字符串拼接函数(比如SQL Server的STRING_AGG),版本符合要求的话也可以直接在原查询投影中使用String.Join,不需要拆分查询。
内容的提问来源于stack exchange,提问作者maX
相关产品推荐
相关产品推荐

