【问题标题】:Linq projection that flattens a list into a deliminated string将列表展平为分隔字符串的 Linq 投影
【发布时间】:2011-05-30 14:54:42
【问题描述】:

我正在尝试连接和逗号分隔(或空格)列表并投影它。我在下面有一些示例代码。

public class Friend
{
    public string Name { get; set; }
}

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    List<Friend> Friends { get; set; }
}

public class ProjectedPerson
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public string FriendsList { get; set; }
}

public class Test
{
    public void MyTest()
    {
        var query = from p in MyDataStore.Person
                select p;

       var results = from q in query
           select new ProjectedPerson
                {
                    PersonID = q.PersonID,
                    FirstName = q.FirstName,
                    Surname = q.Surname,
                    FriendsList = q.FriendsList.Concat() //??? How can I concat this and return a string           
                };

    }
}

【问题讨论】:

  • 我不确定 Concat 是否正确。
  • 我不确定 Concat 是否正确。它可能是聚合的。

标签: linq entity projection


【解决方案1】:

使用 string.Join(请注意,列表首先需要在内存中),从您的 Friend 对象中连接选定的属性。如果您使用的是 .NET 3.5,则需要使用 ToArray() 以及 string.Join 上的重载 3.5 需要一个数组。

var query = (from p in MyDataStore.Person
             select p).ToList();  // <-- bring into memory with ToList()

var results = from q in query
              select new ProjectedPerson
              {
                  PersonID = q.PersonID,
                  FirstName = q.FirstName,
                  Surname = q.Surname,
                  FriendsList = string.Join( ", ", q.Friends.Select( f => f.Name ) )
              };

【讨论】:

    【解决方案2】:

    string.Join 是更好的方法,但滥用 LINQ 实在是太有趣了。

    var query = (from p in MyDataStore.Person
                 select p).ToList();  // <-- bring into memory with ToList()
    
    var results = from q in query
                  select new ProjectedPerson
                  {
                      PersonID = q.PersonID,
                      FirstName = q.FirstName,
                      Surname = q.Surname,
                      FriendsList = q.Friends.Aggregate<Friend, string>(null, (accum, f) => accum + (accum == null ? accum : ", ") + f.Name)
                  };
    

    【讨论】:

    • 非常感谢您的帮助。
    • EF 4.1 说:LINQ to Entities 无法识别方法“System.String Aggregate[..]”
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2011-03-18
    • 2013-10-23
    • 2010-12-20
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多