2011-08-26 121 views
3

我有一個IQueryable<SomePOCO>(LINQ的實體查詢,如果該事項):幫助與C#LINQ投影

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

任何想法?

+0

有趣的是,GroupBy用於從一個標誌結構投影到一個層次結構 - SelectMany會將一個嵌套結構投影到一個扁平結構。 –

回答

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

不錯。只需在末尾添加一個'.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的構造函數,它會爲你轉換它。

+0

這也會起作用,但是自從他第一次進入後,將答案交給了@Bala R。 +1的答案。 – RPM1984

+0

第二名+1 / – BRampersad