Пример #1
0
        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()));
        }
Пример #2
0
        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);
        }