linq 为什么按group.key排序会改变以前排序的数据集的顺序?如何避免?

u1ehiz5o  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(212)
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(),需要一个有序列表来处理。
我在这里做什么?

67up9zun

67up9zun1#

对于在SQL Server上结束的Linq查询,我倾向于避免将 FirstOrDefault()group by 结合使用。并以一种更自定义的方式来编写SQL查询。
尝试通过引入匿名类型来使用Linq的CompositeKey特性(请参阅Microsoft文档)。类型永远不会被示例化,它只是一个抽象来描述你想要的东西。

query = from q in query
    group q by new { 
        q.Student.StudentName, 
        q.Student.StudentDate,
        q.Student.RoleId }
    into qGroup
    orderby qGroup.Key.StudentDate descending
    select qGroup.Key.RoleId;

学生姓名必须包含在分组中,以防有两个学生具有相同的日期和角色ID。StudentDate和RoleId不能使分组更加唯一,因为它们依赖于Student的主键StudentName。
这里我假设在最终结果中只需要RoleId,因为这是在select子句中使用的唯一字段。尽管我不太清楚他的意图。
如果在最终结果中需要更多的字段,您可以创建一个封装这些字段的类,并在最后的select中构造它。像这样:

select new MyClass { Name = qGroup.Key.StudentName, RoleId = qGroup.Key.RoleId };

相关问题