首页 > 解决方案 > 实体框架,Linq:连接子表的结果

问题描述

我有一个现有的 linq 查询,它将一些数据放入视图模型对象中。这工作正常。

我想为子表中的数据添加一个新属性,该属性将以逗号分隔的字符串格式包含子表中的列值。问题:我无法使用 string.join 连接结果

仅显示相关字段的简化版表格

部分

ID 零件号
1 ABC1
2 DEF1

小贩

ID 供应商名称
1 极致
2 约翰

供应商部件名称(供应商特定部件号)

党派 供应商ID 零件名称
1 1 GDSE-553-32
1 2 JWWVV-HH-01

简化版查询

result = (from p in DBContext.Parts.Where(w => w.EquipmentId == eId)
    select new PartModel
        {
            Id = p.Id,
        Number = p.PartNumber,
        VendorPartNames= String.Join(",", DBContext.VendorPartName.Where(w => w.PartId == p.Id).Select(s => s.PartName))//this line causes exception (shown below)
});

例外:

LINQ to Entities 无法识别方法 'System.String Join(System.String, System.String[])' 方法,并且此方法无法转换为存储表达式。

请注意:实际查询有一些连接和其他列,所以请不要建议需要连接的解决方案。

如果我将“VendorPartName”更改为 List 类型,我可以毫无问题地获得结果。

我唯一的问题是“如何将“VendorPartName”属性的结果转换为逗号分隔的字符串? ”例如:根据提供的示例表数据,它应该是 GDSE-553-32、JWWVV-HH-01

标签: entity-frameworklinq

解决方案


实体框架不支持String.Join()方法。

所以,我们可以做的是获取VendorPartNames一个字符串集合,然后我们可以用,.

注意:为此,我们将首先使用匿名对象,然后将其转换为PartModel.

因此,您的查询将如下所示:

var parts = DBContext.Parts
               .Where(w => w.EquipmentId == eId)
               .Select(p => new {
                    Id = p.Id,
                    Number = p.PartNumber,
                    VendorPartNames = p.VendorPartName.Select(n => n.PartName)
               }).ToList();

var result = parts.Select(i => new PartModel {
               Id = i.Id,
               Number = i.Number,
               VendorPartNames = String.Join(",", i.VendorPartNames)
             }).ToList();

推荐阅读