Помощь с C # LINQ Projection - PullRequest
       20

Помощь с C # LINQ Projection

3 голосов
/ 26 августа 2011

У меня есть 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 ]

8 голосов
/ 26 августа 2011

Я думаю, вам просто нужно создать группу по родительскому имени

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
                                                                 })
                              });  
3 голосов
/ 26 августа 2011

Это первый шаг.

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, который преобразует его для вас.

...