实体框架效率

时间:2018-07-28 04:14:01

标签: 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 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;
}

在此,我首先获取所有课程并过滤它们,然后仅获取我需要的列。然后,我返回列表和总数。

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

1 个答案:

答案 0 :(得分:2)

  

我首先获取所有课程并过滤它们,然后仅获取我需要的列。

不,你不是。这句话:

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

创建一个查询(IQueryable),而不是一个集合。在强制枚举查询之前,EF不会将查询转换为SQL查询并将其发送到数据库。在运行.ToListAsync()时会发生这种情况。

  

这是一种有效的方法吗?

只要数据库中Name上有唯一索引,这是相当有效的。