2016-02-21 83 views
0

是什麼,下面的查詢返回類型:如何聲明分組的返回類型的LINQ查詢

var photos = job.Photos.GroupBy(x => x.Location) 
     .Select(group => 
      new 
      { 
       Name = group.Key, 
       Photos = group.OrderByDescending(x => x.DateAdded) 
      }) 
     .OrderBy(group => group.Name) 
     .ToList();  

根據調試它的類型爲:

'System.Collections.Generic.List<<anonymous type: string Name, System.Linq.IOrderedEnumerable<Project.Models.Photo> Photos>>' 

,但我不不知道如何聲明這種類型。

我已經試過

public List<string, IOrderedEnumerable<Photo>> Photos {get; set;) 

但由於調試說名單隻需要一個元素

+0

我不確定我是否理解,是否有與「名稱」和「照片」屬性類型? – Smeegs

回答

1

使用字典來保存字符串鍵和照片列表作爲價值觀,如果你不想創建另一個班級,只是爲了保存這些信息。

IDictionary<string, List<Photo>> photos = job.Photos.GroupBy(x => x.Location) 
     .Select(group => 
      new 
      { 
       Name = group.Key, 
       Photos = group.OrderByDescending(x => x.DateAdded) 
      }) 
     .OrderBy(group => group.Name) 
     .ToDictionary(kv=>kv.Name, kv=>kv.Photos.ToList()); 
0

,這是一個匿名類型。這意味着你不能寫出它的名字,因爲它沒有。你可以做的是創建一個新的類和使用,在您的查詢:

List<PhotosGroup> photos = job.Photos.GroupBy(x => x.Location) 
     .Select(group => 
      new PhotosGroup 
      { 
       Name = group.Key, 
       Photos = group.OrderByDescending(x => x.DateAdded) 
      }) 
     .OrderBy(group => group.Name) 
     .ToList(); 

或者你可以使用Tuple類型:

List<Tuple<string, IOrderedEnumerable<Photo>> photos = job.Photos.GroupBy(x => x.Location) 
     .Select(group => 
      Tuple.Create(
       group.Key, 
       group.OrderByDescending(x => x.DateAdded))) 
     .OrderBy(group => group.Item1) 
     .ToList(); 
1

你有幾個選擇:

  • 你可以創建你的類同時按住分組鍵和與之相關值的集合。並創建該類的實例而不是匿名類型。
  • 你可以使用Dictionary<TKey, TValue>ValueIOrderedEnumerable<T>
var photos = job.Photos 
       .GroupBy(x => x.Location) 
       .ToDictionary(group => group.Key, 
           group => group.OrderByDescending(x => x.DateAdded)); 

OrderByDescending後添加一個額外的ToList呼籲以防止有待解決和分類只有一次的項目。

+0

group.key和group.OrderBy錯誤,因爲組未定義,我在這裏丟失別的東西嗎? – Evonet

+0

@Evonet是的。 ToDictionary需要像這樣.ToDictionary(group => group.Key,group => group.OrderByDescending(x => x.DateAdded)); –