linq - 选择新上下文中两个字段的格式字符串

时间:2015-07-14 07:56:05

标签: c# linq

我有一对多关系的外表。我将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'类型的操作数

请帮我传递此错误并解决问题。

1 个答案:

答案 0 :(得分:3)

lpn.prefixlpn.number都被评估为g.Select(...),因此实际上它们是IEnumerable<T>(正如错误消息所声明的那样)。

将其评估为g.Select(...).FirstOrDefault()会对您有所帮助,因为它会从T中提取IEnumerable<T>类型的值。

<强>更新

在您的情况下,当lpn.prefixlpn.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)));