Пример #1
0
        internal static MethodDeclarationSyntax EqualsFilterExtensionMethod(
            ParameterSyntax collectionParameter,
            PropertyInfo modelProperty)
        {
            var filterParameterName = modelProperty.Name.ToCamelCase();
            var filterParameterType = modelProperty.TypeInfo.IsString()
                ? modelProperty.TypeSyntax
                : NullableType(modelProperty.TypeSyntax);
            var filterParameter = BaseSyntaxGenerator.Parameter(filterParameterType, filterParameterName);
            var collectionName  = collectionParameter.Identifier.Text;

            var condition = modelProperty.TypeInfo.IsString()
                ? StringNotEmptyCheckExpression(filterParameterName)
                : NullableHasValueCheckExpression(filterParameterName);
            var filterExpression = LinqWhereExpression(
                collectionName,
                LambdaGenerator.EqualsPredicate(collectionName.Substring(0, 1), modelProperty.Name, filterParameterName));

            var methodBody = FilterExtensionMethodBody(condition, filterExpression, IdentifierName(collectionName));

            return(FilterExtensionMethod(
                       modelProperty.Name,
                       collectionParameter,
                       filterParameter,
                       methodBody));
        }
Пример #2
0
        internal static IEnumerable <MemberDeclarationSyntax> FilterExtensionMethods(IEnumerable <PropertyInfo> modelProperties, string modelClassName)
        {
            var collectionType      = BaseSyntaxGenerator.GenericType(nameof(IQueryable), modelClassName);
            var collectionName      = modelClassName.ToCamelCase().Pluralize();
            var collectionParameter = BaseSyntaxGenerator.Parameter(collectionType, collectionName);

            var filterMethods = new List <MemberDeclarationSyntax>
            {
                SummaryFilterExtensionMethod(collectionParameter, modelProperties, modelClassName + "Filters")
            };


            foreach (var modelProperty in modelProperties)
            {
                if (modelProperty.FilterType == FilterType.Range)
                {
                    filterMethods.Add(RangeFromFilterExtensionMethod(collectionParameter, modelProperty));
                    filterMethods.Add(RangeToFilterExtensionMethod(collectionParameter, modelProperty));
                    continue;
                }

                if (modelProperty.FilterType == FilterType.Contains)
                {
                    filterMethods.Add(StringContainsFilterExtensionMethod(collectionParameter, modelProperty));
                    continue;
                }

                filterMethods.Add(EqualsFilterExtensionMethod(collectionParameter, modelProperty));
            }

            return(filterMethods);
        }
Пример #3
0
 internal static ExpressionSyntax StringNotEmptyCheckExpression(string parameterName)
 {
     return(PrefixUnaryExpression(
                SyntaxKind.LogicalNotExpression,
                InvocationExpression(BaseSyntaxGenerator.SimpleMemberAccess("string.IsNullOrEmpty"))
                .WithArgumentList(BaseSyntaxGenerator.SeparatedArgumentList(IdentifierName(parameterName)))));
 }
        internal static SimpleLambdaExpressionSyntax ContainsPredicate(
            string lambdaParameter,
            string modelProperty,
            string filterProperty)
        {
            var body = InvocationExpression(BaseSyntaxGenerator.SimpleMemberAccess($"{lambdaParameter}.{modelProperty}.{nameof(Queryable.Contains)}"))
                       .WithArgumentList(BaseSyntaxGenerator.SeparatedArgumentList(IdentifierName(filterProperty)));

            return(LambdaExpression(lambdaParameter, body));
        }
        internal static SimpleLambdaExpressionSyntax LessOrEqualPredicate(
            string lambdaParameter,
            string modelProperty,
            string filterProperty)
        {
            var body = BinaryExpression(
                SyntaxKind.LessThanOrEqualExpression,
                BaseSyntaxGenerator.SimpleMemberAccess(new[] { lambdaParameter, modelProperty }),
                BaseSyntaxGenerator.QualifiedName(filterProperty));

            return(LambdaExpression(lambdaParameter, body));
        }
Пример #6
0
        internal static MethodDeclarationSyntax SummaryFilterExtensionMethod(
            ParameterSyntax collectionParameter,
            IEnumerable <PropertyInfo> modelProperties,
            string filterModelClass)
        {
            var collectionName        = collectionParameter.Identifier.Text;
            var filterPropertiesNames = modelProperties
                                        .SelectMany(p =>
                                                    p.FilterType == FilterType.Range
                        ? new[] { p.Name + "From", p.Name + "To" }
                        : new[] { p.Name })
                                        .ToList();

            var body = Block(SingletonList(ReturnStatement(FilterChainInvocation(filterPropertiesNames))));

            return(ExtensionMethod(
                       "FilterBy",
                       collectionParameter.Type,
                       collectionParameter,
                       new[] { BaseSyntaxGenerator.Parameter(filterModelClass, "filters") },
                       body));

            InvocationExpressionSyntax FilterChainInvocation(IReadOnlyCollection <string> filterProperties)
            {
                string propertyName;

                if (filterProperties.Count == 1)
                {
                    propertyName = filterProperties.First();
                    return(InvocationExpression(
                               MemberAccessExpression(
                                   SyntaxKind.SimpleMemberAccessExpression,
                                   IdentifierName(collectionName).WithTrailingTrivia(Trivias.EndOfLine),
                                   IdentifierName($"FilterBy{propertyName}")).WithLeadingTrivia(Tab),
                               BaseSyntaxGenerator.SeparatedArgumentList(BaseSyntaxGenerator.SimpleMemberAccess($"filters.{propertyName}")))
                           .WithLeadingTrivia(Tab));
                }

                propertyName = filterProperties.Last();
                return(InvocationExpression(
                           MemberAccessExpression(
                               SyntaxKind.SimpleMemberAccessExpression,
                               FilterChainInvocation(filterProperties.Take(filterProperties.Count - 1).ToList())
                               .WithTrailingTrivia(Trivias.EndOfLine),
                               IdentifierName($"FilterBy{propertyName}")),
                           BaseSyntaxGenerator.SeparatedArgumentList(
                               BaseSyntaxGenerator.SimpleMemberAccess($"filters.{propertyName}")))
                       .WithLeadingTrivia(Tab));
            }
        }
Пример #7
0
        internal static MethodDeclarationSyntax StringContainsFilterExtensionMethod(
            ParameterSyntax collectionParameter,
            PropertyInfo modelProperty)
        {
            var filterParameterName = modelProperty.Name.ToCamelCase();
            var filterParameter     = BaseSyntaxGenerator.Parameter(modelProperty.TypeSyntax, filterParameterName);
            var collectionName      = collectionParameter.Identifier.Text;

            var condition        = StringNotEmptyCheckExpression(filterParameterName);
            var filterExpression = LinqWhereExpression(
                collectionName,
                LambdaGenerator.ContainsPredicate(collectionName.Substring(0, 1), modelProperty.Name, filterParameterName));

            var methodBody = FilterExtensionMethodBody(condition, filterExpression, IdentifierName(collectionName));

            return(FilterExtensionMethod(
                       modelProperty.Name,
                       collectionParameter,
                       filterParameter,
                       methodBody));
        }
Пример #8
0
        internal static MethodDeclarationSyntax RangeToFilterExtensionMethod(
            ParameterSyntax collectionParameter,
            PropertyInfo modelProperty)
        {
            var filterParameterName = modelProperty.Name.ToCamelCase() + "To";
            var filterToParameter   = BaseSyntaxGenerator.Parameter(NullableType(modelProperty.TypeSyntax), filterParameterName);
            var collectionName      = collectionParameter.Identifier.Text;

            var condition        = NullableHasValueCheckExpression(filterParameterName);
            var filterExpression = LinqWhereExpression(
                collectionName,
                LambdaGenerator.LessOrEqualPredicate(collectionName.Substring(0, 1), modelProperty.Name, filterParameterName));

            var methodBody = FilterExtensionMethodBody(condition, filterExpression, IdentifierName(collectionName));

            return(FilterExtensionMethod(
                       modelProperty.Name + "To",
                       collectionParameter,
                       filterToParameter,
                       methodBody));
        }
Пример #9
0
 internal static ExpressionSyntax LinqWhereExpression(string collectionName, SimpleLambdaExpressionSyntax predicate)
 {
     return(InvocationExpression(BaseSyntaxGenerator.SimpleMemberAccess(new[] { collectionName, "Where" }))
            .WithArgumentList(BaseSyntaxGenerator.SeparatedArgumentList(predicate)));
 }
Пример #10
0
 internal static ExpressionSyntax NullableHasValueCheckExpression(string parameterName)
 {
     return(BaseSyntaxGenerator.SimpleMemberAccess(new[] { parameterName, nameof(Nullable <int> .HasValue) }));
 }