public IPagedResult <Article> GetList(QueryArticleDto dto) { Expression <Func <Article, bool> > expression = null; if (!string.IsNullOrEmpty(dto.Keyword)) { expression = e => e.Title.Contains(dto.Keyword); } if (dto.CategoryId.HasValue) { Expression <Func <Article, bool> > exp = e => e.CategoryId == dto.CategoryId.Value; if (expression == null) { expression = exp; } else { expression = LambdaExpression.Lambda <Func <Article, bool> >(LambdaExpression.And(expression, exp)); } } if (dto.ArticleId.HasValue) { expression = e => e.Id == dto.ArticleId.Value; } var totalCount = _articleRepository.Count(expression); var query = _articleRepository.GetAll(expression); return(new PagedResultDto <Article>(totalCount, query.ToList())); }
public static ModelBuilder AddGlobalQueryFilter(this ModelBuilder builder, DbContext dbContext, IEnumerable <Assembly> assemblies) { if (assemblies?.Any() != true) { throw new ArgumentNullException(nameof(assemblies)); } var filterProviders = ReflectionHelper.GetAllTypesAssignableTo( typeof(IQueryFilterConfigProvider), assemblies).Select(o => o.CreateInstance <IQueryFilterConfigProvider>()) .ToArray(); if (!filterProviders.Any()) { return(builder); } var eTypes = builder.Model.GetEntityTypes(); foreach (var entityType in eTypes) { // skip Shadow types if (entityType.ClrType == null) { continue; } LambdaExpression finalExpr = null; foreach (var provider in filterProviders.Where(o => !o.Conditions.IsNullOrEmpty())) { LambdaExpression andExpr = null; foreach (var cond in provider.Conditions) { if (cond.Predicate(entityType)) { var expr = provider.GetType().GetInstanceMethod( cond.MethodName, nonPublic: true).InvokeGeneric <LambdaExpression>( provider, new[] { entityType.ClrType }, dbContext); if (andExpr == null) { andExpr = expr; } else { andExpr = andExpr.And(expr); } } } if (andExpr == null) { continue; } if (finalExpr == null) { finalExpr = andExpr; } else { finalExpr = finalExpr.Or(andExpr); } } if (finalExpr != null) { entityType.SetQueryFilter(finalExpr); } } return(builder); }