query = from q in query
orderby q.Student.StudentDate descending
group q by q.Student.StudentName
into qGroup
orderby qGroup.Key
select qGroup
.OrderBy (s => s.Student.RoleId)
.FirstOrDefault();
var studentStates = query
.Skip((model.pageNumber - 1) * model.pageSize)
.Take(model.pageSize);
因为在分组之前,我希望记录按StudentDate
降序排列,它可以工作,但问题是
orderby qGroup.Key
这再次改变了顺序,所以如果我删除它,那么另一个问题发生了,这是Skip()
和Take()
,需要一个有序列表来处理。
我在这里做什么?
1条答案
按热度按时间67up9zun1#
对于在SQL Server上结束的Linq查询,我倾向于避免将 FirstOrDefault() 与 group by 结合使用。并以一种更自定义的方式来编写SQL查询。
尝试通过引入匿名类型来使用Linq的CompositeKey特性(请参阅Microsoft文档)。类型永远不会被示例化,它只是一个抽象来描述你想要的东西。
学生姓名必须包含在分组中,以防有两个学生具有相同的日期和角色ID。StudentDate和RoleId不能使分组更加唯一,因为它们依赖于Student的主键StudentName。
这里我假设在最终结果中只需要RoleId,因为这是在select子句中使用的唯一字段。尽管我不太清楚他的意图。
如果在最终结果中需要更多的字段,您可以创建一个封装这些字段的类,并在最后的select中构造它。像这样: