我有一个一对多关系的实体。但我需要孩子的收藏在一个特定的顺序。下面是一个例子:
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会导致Students集合的延迟加载,所以当我将其序列化为JSON并通过Web发送它时,它基本上会自动填充学生列表。但是,我总是需要那些学生保持一定的顺序,比如从最高到最低的年级顺序。我想出的是:
var course=db.Courses.Find(id);
course.Students=course.Students.OrderByDescending(s=>s.Grade).ToArray();这似乎有效,但我担心这不是最有效的方法。
因此,我的问题是:是否有更好的方法来确保儿童收集有一个特定的顺序?假设我总是希望子集合按这个顺序排列,那么我不应该指定virtual并避免延迟加载吗?如果排序顺序比OrderBy子句中包含的排序顺序更复杂,那么答案是否会改变(例如,将学生按年排列,然后在每年内按年级顺序排列)?
发布于 2016-04-01 12:53:24
好的,我做了一些测试,根据Derck的回答,这就是我最后所做的:
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不是mutator方法,这也是Seabizkit的答案不太管用的原因--您必须将集合设置为OrderBy返回的结果。
发布于 2016-03-18 12:36:38
您可以通过向查询中添加Include语句来获取数据,从而使用急切加载。如果您使用延迟加载,不管您是否需要它,它总是会加载数据。
db.Courses.Include(x=>x.Students)
.SingleOrDefault(x => x== id)
.OrderByDescending(s=>s.Students.Grade).ToArray();发布于 2016-03-18 13:59:51
试试这个,如果有效..。
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();结果将是一门所有学生的课程。
https://stackoverflow.com/questions/36084225
复制相似问题