我正在尝试获取给定页面索引和页面大小的课程列表。这是我的操作方法:
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个查询以获取总数和过滤后的结果。如果有更好的方法,请告诉我。谢谢。
答案 0 :(得分:2)
我首先获取所有课程并过滤它们,然后仅获取我需要的列。
不,你不是。这句话:
var allCourses = from s in _Context.Courses
select s;
创建一个查询(IQueryable),而不是一个集合。在强制枚举查询之前,EF不会将查询转换为SQL查询并将其发送到数据库。在运行.ToListAsync()
时会发生这种情况。
这是一种有效的方法吗?
只要数据库中Name上有唯一索引,这是相当有效的。