2016-02-21 58 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)); –