在选择新上下文中从两个字段格式化字符串

本文关键字:两个 字段 字符串 格式化 选择 上下文 | 更新日期: 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.prefixlpn.number都被求值为g.Select(...),因此实际上它们是IEnumerable<T>(正如错误消息所声明的那样)。

将它们计算为g.Select(...).FirstOrDefault()应该对您有所帮助,因为它将从IEnumerable<T>中提取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)));