Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6中的ICollections排序_C#_Entity Framework - Fatal编程技术网

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();