gpt4 book ai didi

c# - 使用 Linq to Entities 进行分组和多重排序

转载 作者:太空狗 更新时间:2023-10-29 21:40:50 29 4
gpt4 key购买 nike

我有这两个实体:

public class Course
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public virtual ICollection<Class> Classes { get; set; }
}

public class Class
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; } ]
public Course Course { get; set; }
}

现在我需要按类(class)列出每个类(class)分组并按(降序)Course.StartDate 然后按 Class.StartTime 排序。我可以按类(class)分组并按类(class)排序。开始日期:

var myList = context.Classes
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate).ToList()

但无法同时按 StartTime 对每个类进行排序。我试过这个:

var myList = context.Classes
.OrderBy(c => c.StartTime)
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate).ToList()

甚至这个:

var myList = context.Classes
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate)
.ThenBy(g => g.Select(c => c.StartTime)).ToList()

但是这些类从不按它的开始时间排序。

*编辑以获得更好的说明:这是针对 WebService 的,我必须返回 List<IGrouping<Course, Class>>我真的想要一种优雅的方式来做到这一点(即仅使用 Linq),而无需手动创建列表。当然,除非不可能。

感谢任何帮助(顺便说一句,我使用的是 EF 代码优先 4.3)。

最佳答案

如果您需要保留签名,我建议如下:

var myList = context.Classes
.GroupBy(cc => cc.Course)
.OrderByDescending(gg => gg.Key.StartDate)
.ToArray() // <- stops EF and starts L2O
.SelectMany(gg => gg.OrderBy(cc => cc.StartTime))
.ToLookup(cc => cc.Course, cc => cc)
.ToList();

这会产生一种签名:List<IGrouping<Course, Class>>并按 StartTime 正确订购它们.这依赖于 ToLookup 的行为关于维护已发现的订单,可能会发生变化。

关于c# - 使用 Linq to Entities 进行分组和多重排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080517/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com