LINQ - 从“select new”上下文中的两个字段格式化字符串

4

我有一个外部表格,它和其他表格是一对多的关系。我编写了一个类似于左连接的 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个回答

3

lpn.prefix.Concat(lpn.number).Select(...).FirstOrDefault()

This will concatenate the two lists and then extract the first value of type T.

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)));

谢谢。是的,当我尝试使用FirstOrDefault()时它有效了。但是这里有一个“一对多”的关系。我想从电话中返回一个字符串,例如(12) 4589524;(077) 7090701(077) 7090701; (050) 2561024,而不仅仅是(12) 4589524;。 - loviji
@loviji,在这种情况下,您需要将两个列表连接起来。请查看更新的答案。 - Andrey Korneyev
为了对两个列表的相应项目执行操作,可以使用“Zip”方法。请参见我很久以前提出的一个问题https://dev59.com/xGs05IYBdhLWcg3wPfgR。它可以避免手动索引第二个数组,从而使其更加高效。 - Chris
1
@Chris 谢谢,我之前不知道 Zip 方法。看起来非常优雅。 - Andrey Korneyev
是的。我发现它是因为我想:“肯定有类似这样的东西存在”,然后发现它确实存在。 :) - Chris
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接