如何在权限框架中选择分组后的列

时间:2017-05-09 17:56:45

标签: sql sql-server entity-framework group-by

我试图在EF中进行groupby操作后选择多个列。

这是我想要做的:

this._context.dbtablename
             .Select(u => new { u.name, u.age, u.grade })
             .GroupBy(x => x.grade)
             .Select(g => new { name = g.?, age = g.??, grade = u.key, Count = g.Count() })

示例:

name age grade
A     12    8
B     12    9
C     11    10
D     11    9

我希望:

name age grade
A     12  8
B     12  9        ----> "name" is B or D, "age" is "12" or "11", does not matter.
C     11  10

我能实现吗?

2 个答案:

答案 0 :(得分:2)

每个分组项目都有一个密钥和集合,因此您可以使用first()或firstordefault()来获取每个组中的第一个项目

this._context.dbtablename
                .Select(u => new { u.name, u.age, u.grade })
                .GroupBy(a => a.grade)
                .Select(a => new { name = a.First().name, age = a.First().age, grade = a.Key, count = a.Count() });

或min()或max()

.Select(a => new { name = a.Min(b => b.name), age = a.Min(b => b.age), grade = a.Key, count = a.Count() });

答案 1 :(得分:0)

以下期间(YearMonth YYYYMM)返回有效订单数(where子句):

GM_ORDER.AsQueryable()
    .Where(s => s.STATUS > -1)
    .Select(s => new { DateOfOrder = s.CREATEDON.Date, s.ORDERID })
    .GroupBy(g =>  g.DateOfOrder.Year*100 + g.DateOfOrder.Month )
    .OrderByDescending(o=>o.Key)
    .Select(g => new { Period = g.Key, NrOfOrders = g.Count()} )

输出是:

Period NrOfOrders    
201705 13 
201704 34 
201703 42 
201702 17 
201701 17 
201612 25 
201611 34 
201610 54 
201609 135 
201608 163 
201607 110 
201606 169 
201605 100 
201604 56 
201603 19 
201602 8 
201601 6 

希望这有帮助。

编辑:

如果您想查看以下分组中的更多列将有所帮助。要进行排序,您需要将其置于列表变量中,然后对列表变量进行排序。

GM_ORDER.AsQueryable()
    .Where(s => s.STATUS > -1)
    .Select(s => new { DateOfOrder = s.CREATEDON.Date, s.ORDERID, s.STATUS })
    .GroupBy(g => new { YYYYMM = g.DateOfOrder.Year * 100 + g.DateOfOrder.Month, g.STATUS })
    .Select(g => new { Period = g.Key.YYYYMM, Status = g.Key.STATUS, NrOfOrders = g.Count() })
    .ToList()