Помогите с C# LINQ Projection
У меня есть IQueryable<SomePOCO>
(запрос LINQ-Entities, если это имеет значение):
public class SomePOCO
{
public string ParentName { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
И я пытаюсь проецировать на один объект (лучше всего анонимный тип, так как мне нужна только область действия метода), который имеет 2 свойства:
public string ParentName { get; set; }
public ICollection<SimplePoco> { get; set;
SimplePOCO выглядит следующим образом:
public class SimplePOCO
{
public string Name { get; set; }
public string Url { get; set; }
}
Причина, по которой я это делаю, заключается в том, что все извлекаемые им данные SomePOCO имеют одно и то же ParentName, поэтому я просто хочу это один раз, вместо того, чтобы выводить по проводу одно и то же значение N количество раз и делать .First()
,
Надеюсь, что это имеет смысл.
Конечный результат я должен быть в состоянии сделать это:
var parentName = result.ParentName; // string
var pocos = result.SimplePOCOs; // ICollection<SimplePOCO>
Я думаю, что мне либо нужна какая-то агрегация, как с GroupBy
или же SelectMany
,
Есть идеи?
2 ответа
Я думаю, что вам просто нужно сделать группу по родительскому имени
var result = collection.GroupBy(i => i.ParentName)
.Select(g => new {
ParentName = g.Key,
SimplePocos = g.Select(i => new SimplePoco
{
Name = i.Name,
Url = i.Url
})
});
Это первый шаг.
var groups = myQ.GroupBy(p => p.ParentName);
Вам понадобится ваша средняя структура данных. Я позвоню Grouping
,
var myList = new List<Grouping>();
foreach (var group in groups) {
var newGrouping = new Grouping();
new Grouping.ParentName = group.Key;
newGrouping.SimplePocos = group.Select(p => new SimplePoco(p)).ToArray();
}
У вас должен быть конструктор SimplePoco
это превратит это для вас.