2014-01-16 153 views
3

我做了一个C#LINQ查询,按属性分类(或分组),我几乎可以肯定有一个更好的方法。我的项目充满了这些疑问,所以我对如何以正确的方式实现这一目标非常感兴趣。正确的方法来分类属性

这是我的查询什么样子:JSON输出的

var g = _repository.GetEmployees(); 
var result = 
    g.GroupBy(x => x.City, (key, group) => group.First()) 
    .Select(x => new { 
     city = x.City, 
     employees = g 
      .Where(y=>y.EmployeeID == x.EmployeeID) 
      .Select(y=> new { 
       fullname = y.FirstName + " " + y.LastName, 
       title = y.Title 
      }) 
      .OrderBy(y=>y.fullname) 
    }) 
    .OrderBy(x => x.city); 

样品:

[ 
    { 
     "city":"Barcelona", 
     "employees":[ 
      { 
       "fullname":"Foo Bar", 
       "title":"Help Desk Technician" 
      }, 
      { 
       "fullname":"Lorem Ipsum", 
       "title":"Information Technology Director" 
      } 
     ] 
    }, 
    { 
     "city":"London", 
     "employees":[ 
      { 
       "fullname":"Le Query", 
       "title":"Information Technology Manager" 
      }, 
      { 
       "fullname":"Please Help", 
       "title":"Management Information Systems Director" 
      } 
     ] 
    } 
] 

结果是好的。实现它的最好方法是什么?

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

@JohnSaunders谢谢,对不起 –

回答

5

这听起来像你只是想:

var result = g.GroupBy(x => x.City, (key, group) => new { 
          city = key, 
          employees = group.Select(emp => new { 
           fullname = emp.FirstName + " " + emp.LastName, 
           title = emp.Title 
          }) 
         }); 

换句话说,你只是在为每个组,这是“匿名类型与城市的投影,并为全市所有员工”。

+0

绝对完美!非常感谢。当然,我应该买一本你的书:) –