Hen*_*nda 6 c# linq linq-to-entities ef-code-first
我有这两个实体:
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; }
}
Run Code Online (Sandbox Code Playgroud)
现在我需要按课程列出每个Class分组,并按(降序)Course.StartDate然后按Class.StartTime排序.我可以按课程分组并按课程顺序开始.StartDate:
var myList = context.Classes
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate).ToList()
Run Code Online (Sandbox Code Playgroud)
但是无法通过它的StartTime来管理每个Class.我试过这个:
var myList = context.Classes
.OrderBy(c => c.StartTime)
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate).ToList()
Run Code Online (Sandbox Code Playgroud)
甚至这个:
var myList = context.Classes
.GroupBy(c => c.Course)
.OrderByDescending(g => g.Key.StartDate)
.ThenBy(g => g.Select(c => c.StartTime)).ToList()
Run Code Online (Sandbox Code Playgroud)
但是Classes从来没有按它的StartTime排序.
*编辑以获得更好的说明:这是一个WebService,我必须返回一个List<IGrouping<Course, Class>>
,我真的想要一个优雅的方式(即只使用Linq),而无需手动创建列表.除非当然不可能.
任何帮助是apreciated(我使用EF代码优先4.3 btw).
如果您需要保留签名,我建议如下:
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();
Run Code Online (Sandbox Code Playgroud)
这会产生一种签名:List<IGrouping<Course, Class>>
并使它们正确排序StartTime
。ToLookup
这取决于维护所发现的订单的行为,并且可能会发生变化。
归档时间: |
|
查看次数: |
1039 次 |
最近记录: |