#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. Агрегат строк [..]’