C# 实体框架6中的ICollections排序
我有一个一对多关系的实体。但我需要孩子们的收集有一定的顺序。下面是一个例子:C# 实体框架6中的ICollections排序,c#,entity-framework,C#,Entity Framework,我有一个一对多关系的实体。但我需要孩子们的收集有一定的顺序。下面是一个例子: public class Course { public int ID{get;set;} public string Name{get;set;} public virtual ICollection<Student> Students{get;set;} } public class Student { public int ID{get;set;} public
public class Course
{
public int ID{get;set;}
public string Name{get;set;}
public virtual ICollection<Student> Students{get;set;}
}
public class Student
{
public int ID{get;set;}
public string FirstName{get;set;}
public string LastName{get;set;}
public decimal Grade{get;set;}
}
这似乎有效,但我担心这不是最有效的方法
所以我的问题是:有没有更好的方法来确保子集合具有指定的顺序?假设我总是希望子集合按此顺序排列,我是否应该指定
virtual
并避免延迟加载?如果排序顺序比OrderBy
子句中包含的排序顺序更复杂(例如,将学生按年份排序,然后在每年内按年级排序),答案是否会改变?您可以通过向查询中添加Include语句来使用即时加载来获取数据。如果使用延迟加载,无论是否需要,它都会加载数据
db.Courses.Include(x=>x.Students)
.SingleOrDefault(x => x== id)
.OrderByDescending(s=>s.Students.Grade).ToArray();
试试这个,应该有用
var data = db.Courses.Include(x=>x.Students)
.SingleOrDefault(x=>x.ID == id);
data.Students.OrderByDescending(x => x.Grade);
如果你在很多课程中都这样做,你可以做如下的事情
var data = db.Courses.Include(x=>x.Students)
.Where(x=>x.Name.Contains("high"))
.ToList();
List<Courses> res = data.ForEach(x => x.Students = x.Students
.OrderByDescending(x => x.Grade)
.ToList())
.ToList();
var data=db.Courses.Include(x=>x.Students)
其中(x=>x.Name.Contains(“高”))
.ToList();
列表res=data.ForEach(x=>x.Students=x.Students
.OrderByDescending(x=>x.Grade)
.ToList())
.ToList();
结果将是一门所有学生都参加的课程。好的,我做了一些测试,根据德克的答案,我最终做了以下工作:
var course=db.Courses.Include(x=>x.Students).SingleOrDefault(x=>x.ID==id);
course.Students=course.Students.OrderByDescending(s=>s.Grade).ToList();
需要一点解释:似乎没有任何方法可以编写linq whery来对子集合进行排序(CarbineCoder的答案仍然不起作用),这必须单独完成。为了防止多个数据库调用,我使用了
Include
子句来加载Students
集合,以便在内存中对其进行排序Include
不能与Find
一起使用,这就是我使用SingleOrDefault
的原因。然而,OrderBy
不是一种变异方法,这就是为什么Seabizkit的答案不太有效的原因——您必须将集合设置为等于OrderBy
返回的结果,这可能是最有效的方法。您不能立即对急切/懒散加载的数据进行排序,不过您可以跳过ToArray
调用。不过,请确保立即加载数据,现在您正在进行2 db调用,这比在内存中对集合进行排序效率要低得多。谢谢。ToArray
或类似的东西似乎是必要的,因为否则编译器会抛出一个错误--“IORDerenumerable
不能隐式转换…”啊,是的,应该想到这一点。如果你真的想消除一瞬间,使用ToList
,速度会快一点,因为ToArray
必须计算精确的大小:p这根本不起作用<至少根据visual studio编译器的说法,代码>查找根本不适用于包含
,而OrderByDescending
只会对课程
的属性进行排序,而不会对学生
var course=db.Courses.Include(x=>x.Students).SingleOrDefault(x=>x.ID==id);
course.Students=course.Students.OrderByDescending(s=>s.Grade).ToList();