Проекция Linq, которая сглаживает список в строку с разделителями

#linq #entity #projection

#linq #объект #проекция

Вопрос:

Я пытаюсь объединить список, разделенный запятой (или пробелом), и спроецировать его. У меня есть несколько примеров кода ниже.

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

    }
}
  

Комментарии:

1. Я не уверен, правильно ли используется Concat.

2. Я не уверен, правильно ли используется Concat. Это может быть Aggregate.

Ответ №1:

Используйте string.Объединение (обратите внимание, что список сначала должен быть в памяти), чтобы объединить выбранные свойства из ваших объектов Friend. Если вы используете .NET 3.5, вам нужно будет использовать toArray(), а также перегрузки для string.Для объединения в 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:

строка.Объединение — лучший способ, но злоупотреблять 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)
              };
  

Комментарии:

1. В EF 4.1 говорится: LINQ для Entities не распознает метод ‘System. Агрегат строк [..]’