C# 筛选器、顺序和分页实现太慢
我正在实现一个DB,其中我想包括高级过滤器和手动分页搜索,但我很难使后端方法高效。由于实体数足够大(我目前正在测试700个实体),下面的代码通常会在加载页面时使服务器挂起或给出内部服务器错误(500) 我的测试得出结论,如果我删除排序和过滤部分(仅左侧分页),则该算法可以处理大量数据,但我希望尝试满足所有要求 以下是我在后端的代码:C# 筛选器、顺序和分页实现太慢,c#,linq,asp.net-core,entity-framework-core,C#,Linq,Asp.net Core,Entity Framework Core,我正在实现一个DB,其中我想包括高级过滤器和手动分页搜索,但我很难使后端方法高效。由于实体数足够大(我目前正在测试700个实体),下面的代码通常会在加载页面时使服务器挂起或给出内部服务器错误(500) 我的测试得出结论,如果我删除排序和过滤部分(仅左侧分页),则该算法可以处理大量数据,但我希望尝试满足所有要求 以下是我在后端的代码: public IQueryable<Movie> GetMovies(int page, int pageSize, out int totalMovi
public IQueryable<Movie> GetMovies(int page, int pageSize, out int totalMoviesCount,
string sortOrder, string searchString, string actorName, string genreName)
{
var Movies = from m in _dbContext.Movies
.Include(m => m.MoviesDirectors)
.ThenInclude(ba => ba.Director)
.Include(m => m.MoviesGenres)
.ThenInclude(mg => mg.Genre)
.Include(m => m.MoviesActors)
.ThenInclude(ma => ma.Actor)
select m;
// filter
if (!string.IsNullOrEmpty(searchString))
{
Movies = Movies.Where(m => m.Title.Contains(searchString));
}
//
// .. genre and actor filtering
//order
switch (sortOrder)
{
case "title":
Movies = Movies.OrderBy(m => m.Title);
break;
case "titledesc":
Movies = Movies.OrderByDescending(m => m.Title);
break;
case "year":
Movies = Movies.OrderBy(m => m.PublishDate).ThenBy(m => m.Title);
break;
//
// .. likes, rating and default ordering
}
totalMoviesCount = Movies.Count();
return Movies
.Skip(page * pageSize)
.Take(pageSize);
}
public IQueryable GetMovies(int page,int pageSize,out int totalmoviescont,
字符串排序器、字符串搜索字符串、字符串actorName、字符串genreName)
{
var Movies=来自_dbContext.Movies中的m
.包括(m=>m.MoviesDirectors)
.然后包括(ba=>ba.董事)
.包括(m=>m.Movies体裁)
.然后包括(mg=>mg.流派)
.包括(m=>m.MoviesActors)
.ThenInclude(ma=>ma.Actor)
选择m;
//滤器
如果(!string.IsNullOrEmpty(searchString))
{
Movies=Movies.Where(m=>m.Title.Contains(searchString));
}
//
//…类型和演员筛选
//命令
开关(分拣机)
{
案例“标题”:
Movies=Movies.OrderBy(m=>m.Title);
打破
案例“标题ESC”:
Movies=Movies.OrderByDescending(m=>m.Title);
打破
案件“年份”:
Movies=Movies.OrderBy(m=>m.PublishDate),然后by(m=>m.Title);
打破
//
//…喜欢、评级和默认顺序
}
totalMoviesCount=Movies.Count();
回归电影
.跳过(页面*页面大小)
。取(页面大小);
}
我认为这是可行的,但我不知道我遗漏的部分在哪里。首先对_dbContext.Movies进行必要的过滤。完成此筛选后,您可以简单地从其他表加载所有其他数据。这将加快加入速度,因为你不会加入每一部电影,而是只加入你感兴趣的电影
p.S.变量应以小写字母开头:)首先在_dbContext.Movies上执行所需的筛选。完成此筛选后,您可以简单地从其他表加载所有其他数据。这将加快加入速度,因为你不会加入每一部电影,而是只加入你感兴趣的电影
请注意,变量应以小写字母开头:)您好,欢迎使用堆栈溢出。你试过添加数据库索引吗?700算不了什么。您是否在ManagementStudio中尝试了生成的查询?(如果这是Sql Server)。更有可能的是,你遗漏了一些重要的指标。如果你要问一个关于性能的问题,你一定已经排除了常见的疑点(索引、db服务器资源、网络延迟等等),大家好,欢迎来到stack overflow。你试过添加数据库索引吗?700算不了什么。您是否在ManagementStudio中尝试了生成的查询?(如果这是Sql Server)。更有可能的是,你遗漏了一些重要的指标。如果你问一个关于性能的问题,你必须排除通常的怀疑(索引、db服务器资源、网络延迟,更不用说主要的怀疑)。这里没有“第一”。查询首先组成,在
.Count()
之前不执行,然后在return
语句中执行。事实上,EF core将执行单独的过滤和分页查询,以获取包含的数据。所以没有加入“每一部电影”,这里没有“第一部”。查询首先组成,在.Count()
之前不执行,然后在return
语句中执行。事实上,EF core将执行单独的过滤和分页查询,以获取包含的数据。所以没有人会加入“每部电影”。