我试图在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
我能实现吗?
答案 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()