帮助C#LINQ投影

时间:2011-08-26 01:14:33

标签: c# linq .net-4.0 linq-to-entities 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”的im检索具有相同的ParentName,所以我只想要一次,而不是将线路带来相同的N次并做一次.First()

希望这是有道理的。

最终结果是我应该能够做到这一点:

var parentName = result.ParentName; // string
var pocos = result.SimplePOCOs; // ICollection<SimplePOCO>

我认为我需要某种聚合,例如GroupBySelectMany

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

我认为您只需按父母姓名

进行分组
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
                                                                 })
                              });  

答案 1 :(得分:3)

这是第一步。

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的构造函数,它会为你转换它。