entity-framework - 实体框架,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
解决方案
实体框架不支持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();
推荐阅读
- php - 让 Guzzle 信任自签名证书?
- sql - postgres中印度语的字数
- java - 如何使用操作类在相邻窗口或选项卡中打开链接(上下文单击元素-> sendkeys ArrowDown -> sendkeys Enter)
- rest - REST API 中嵌套资源的权限
- swift - 对数组修改执行闭包
- grafana - 如何将哈希命名的 .wsp 文件与我标记的石墨指标相关联?
- android - 可以在循环中使用 CountDownTimer 吗?
- rabbitmq - 使用 CLI 命令管理 Openshift 上的 RabbitMQ 消息代理的问题
- asp.net - 如何从同一页面上另一个用户控件的用户控件访问文本框和组合框等控件的值
- java - 禁用时如何使搜索栏变灰?