【问题标题】:Help with C# LINQ ProjectionC# LINQ 投影帮助
【发布时间】:2011-08-26 01:14:32
【问题描述】:

我有一个 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 会将嵌套结构投影到平面结构。

标签: c# linq .net-4.0 linq-to-entities projection


【解决方案1】:

我认为您只需要按父名称进行分组

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() 以实现查询。谢谢!
【解决方案2】:

这是第一步。

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 是第一个进来的,所以将答案交给了他。为答案+1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多