我有一对多关系的外表。我将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.IEnumerable'和'System.Collections.Generic.IEnumerable'类型的操作数
请帮我传递此错误并解决问题。
答案 0 :(得分:3)
lpn.prefix
和lpn.number
都被评估为g.Select(...)
,因此实际上它们是IEnumerable<T>
(正如错误消息所声明的那样)。
将其评估为g.Select(...).FirstOrDefault()
会对您有所帮助,因为它会从T
中提取IEnumerable<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)));