在选择新上下文中从两个字段格式化字符串
本文关键字:两个 字段 字符串 格式化 选择 上下文 | 更新日期: 2023-09-27 18:02:45
我有一个一对多关系的外表。我将linq查询写成左连接等价,并根据相关的id字段实现分组。
from p in db.personal join pn in
(from t in db.phoneNumbers
group t by t.personID into g
select new { id = g.Key,
number = g.Select(t => t.number),
prefix = g.Select(t => t.prefix)
}).AsEnumerable()
on p.ID equals pn.id
into lPN from lpn in lPN.DefaultIfEmpty()
//join wsd in db.basicOperations on p.ID equals wsd.personID
where p.ID == id.Value
select new partialPersonDetailsViewModel()
{
id = id.Value,
genderType = p.genderType,
sPhoneNumbers="(" +lpn.prefix+") "+lpn.number
}).FirstOrDefault();
但是在sPhoneNumbers="(" +lpn.prefix+") "+lpn.number
这个地方VS通知我错误:
错误1操作符"+"不能应用于"System.Collections.Generic"类型的操作数。’和‘System.Collections.Generic’。IEnumerable '
请帮我传递这个错误并解决这个问题
lpn.prefix
和lpn.number
都被求值为g.Select(...)
,因此实际上它们是IEnumerable<T>
(正如错误消息所声明的那样)。
将它们计算为g.Select(...).FirstOrDefault()
应该对您有所帮助,因为它将从IEnumerable<T>
中提取T
类型的值。
更新:
在您的情况下,当lpn.prefix
和lpn.number
实际上是值的列表,并且您需要连接这些列表时,您可以使用以下内容:
sPhoneNumbers = String.Join("; ",
lpn.prefix.Select((p, i) =>
String.Format("({0}){1}",
p,
lpn.numbers.Skip(i).Take(1).FirstOrDefault())));
或者你可以使用Enumerable.Zip
方法,正如@Chris在评论中建议的那样:
sPhoneNumbers = String.Join("; ",
lpn.prefix.Zip(lpn.numbers,
(s, s1) => string.Format("({0}){1}", s, s1)));