C# 实体框架效率

C# 实体框架效率,c#,entity-framework,C#,Entity Framework,我正在尝试获取给定页面索引和页面大小的课程列表。这是我的行动方法: public async Task<ActionResult<object>> Get(int? page, int? pageSize) { page = page == null || page < 0 ? 0 : page; pageSize = pageSize == null || pageSize < 1 ? 5 : pageSize; var skipFr

我正在尝试获取给定页面索引和页面大小的课程列表。这是我的行动方法:

public async Task<ActionResult<object>> Get(int? page, int? pageSize)
{
    page = page == null || page < 0 ? 0 : page;
    pageSize = pageSize == null || pageSize < 1 ? 5 : pageSize;
    var skipFrom = (int)(page * pageSize);

    var allCourses = from s in _Context.Courses
                     select s;

    var courseList = await allCourses
                           .OrderBy(t => t.Name)
                           .Skip(skipFrom)
                           .Take((int)pageSize)
                           .Select(c => new
                                        {
                                             c.Id,
                                             c.Name,
                                             c.CourseCode,
                                        })
                           .AsNoTracking()
                           .ToListAsync();

    var result = new
        {
            courses = courseList,
            count = allCourses.Count()
        };

    return result;
}
public异步任务Get(int?page,int?pageSize)
{
page=page==null | | page<0?0:page;
pageSize=pageSize==null | | pageSize<1?5:pageSize;
var skipFrom=(int)(页面*页面大小);
var allCourses=来自_Context.Courses中的s
选择s;
var courseList=等待所有课程
.OrderBy(t=>t.Name)
.Skip(skipFrom)
.Take((int)页面大小)
.选择(c=>new
{
c、 身份证,
c、 名字,
c、 课程代码,
})
.AsNoTracking()
.ToListAsync();
var结果=新
{
课程=课程列表,
count=allCourses.count()
};
返回结果;
}
在本文中,我首先获取所有课程并对它们进行过滤,只获取我需要的列。然后我返回列表和总数

这是一种有效的方法吗?否则,我必须编写两个查询来获取总计数和过滤结果。如果有更好的方法,请告诉我。谢谢

我首先获取所有课程并对它们进行过滤,只获取我需要的专栏

不,你不是。本声明:

var allCourses = from s in _Context.Courses
                     select s;
创建查询(),而不是集合。在强制枚举查询之前,EF不会将查询转换为SQL查询并将其发送到数据库。在这里,当您运行
.toListSync()
时会发生这种情况

这是一种有效的方法吗

只要数据库中有一个唯一的名称索引,这是相当有效的

我首先获取所有课程并对它们进行过滤,只获取我需要的专栏

不,你不是。本声明:

var allCourses = from s in _Context.Courses
                     select s;
创建查询(),而不是集合。在强制枚举查询之前,EF不会将查询转换为SQL查询并将其发送到数据库。在这里,当您运行
.toListSync()
时会发生这种情况

这是一种有效的方法吗


只要数据库中有一个唯一的名称索引,这是相当有效的。

也就是说,整个
allCourses
作业可以避免,只作为
wait\u Context.Courses.OrderBy(t=>t.Name)…
使用,整个
allCourses
作业可以避免,只作为
wait\u Context.Courses.OrderBy(t=>t.Name).
在我个人使用实体框架的经验中,使用SQL分析器检查总是很好的(我假设您有一个SQL Db)。这是一个相当简单的查询,但当您开始执行更复杂的查询时,EF可以为您的数据库创建非有效查询。当您知道确切的查询时,更容易检查是否一切正常。例如,检查它使用了哪些索引等。请查看PagedList库以避免所有这些样板代码。剩下的:不用担心第二次计数查询。根据我个人使用Entity Framework的经验,使用SQL分析器检查总是很好的(我假设您有一个SQL Db)。这是一个相当简单的查询,但当您开始执行更复杂的查询时,EF可以为您的数据库创建非有效查询。当您知道确切的查询时,更容易检查是否一切正常。例如,检查它使用了哪些索引等。请查看PagedList库以避免所有这些样板代码。其余的:不要担心第二次计数查询。