使用C# LINQ投影的帮助

3

我有一个 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>

我认为我需要某种聚合方式,例如使用GroupBySelectMany
有什么想法吗?

有趣的是,GroupBy用于从标志结构投影到分层结构 - SelectMany将嵌套结构投影到平面结构。 - Kirk Broadhurst
2个回答

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

不错。我刚刚在末尾添加了一个.SingleOrDefault()来实现查询。谢谢! - RPM1984

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的构造函数来帮你转换它。

这也可以,但是因为@Bala R先回答了,所以把答案给他。对于这个答案点赞。 - RPM1984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接