首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6中的ICollections排序

实体框架6中的ICollections排序
EN

Stack Overflow用户
提问于 2016-03-18 12:19:32
回答 3查看 307关注 0票数 2

我有一个一对多关系的实体。但我需要孩子的收藏在一个特定的顺序。下面是一个例子:

代码语言:javascript
复制
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发送它时,它基本上会自动填充学生列表。但是,我总是需要那些学生保持一定的顺序,比如从最高到最低的年级顺序。我想出的是:

代码语言:javascript
复制
var course=db.Courses.Find(id);
course.Students=course.Students.OrderByDescending(s=>s.Grade).ToArray();

这似乎有效,但我担心这不是最有效的方法。

因此,我的问题是:是否有更好的方法来确保儿童收集有一个特定的顺序?假设我总是希望子集合按这个顺序排列,那么我不应该指定virtual并避免延迟加载吗?如果排序顺序比OrderBy子句中包含的排序顺序更复杂,那么答案是否会改变(例如,将学生按年排列,然后在每年内按年级顺序排列)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-01 12:53:24

好的,我做了一些测试,根据Derck的回答,这就是我最后所做的:

代码语言:javascript
复制
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返回的结果。

票数 1
EN

Stack Overflow用户

发布于 2016-03-18 12:36:38

您可以通过向查询中添加Include语句来获取数据,从而使用急切加载。如果您使用延迟加载,不管您是否需要它,它总是会加载数据。

代码语言:javascript
复制
db.Courses.Include(x=>x.Students)
          .SingleOrDefault(x => x== id) 
          .OrderByDescending(s=>s.Students.Grade).ToArray();
票数 0
EN

Stack Overflow用户

发布于 2016-03-18 13:59:51

试试这个,如果有效..。

代码语言:javascript
复制
 var data =  db.Courses.Include(x=>x.Students)
                 .SingleOrDefault(x=>x.ID == id);

 data.Students.OrderByDescending(x => x.Grade);

如果你在很多课程上都这样做,你可以做一些类似的事情

代码语言:javascript
复制
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();

结果将是一门所有学生的课程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36084225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档