Esempio n. 1
0
        protected override Expression GetWhereClause(Context context, PropertyInfo queryProperty)
        {
            var targetModelPropertyName = queryProperty.Name;
            var columnName       = this.GetColumnName(context.ModelType, targetModelPropertyName);
            var propertyType     = queryProperty.PropertyType;
            var memberExpression = Expression.Property(context.QueryExpression, queryProperty);

            var options        = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(context.Analyzer);
            var startDelimiter = options.StartDelimiter;
            var endDelimiter   = options.EndDelimiter;

            var constantExpression = Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} = ");

            Expression keyExpr     = Expression.Constant($"@{columnName}");
            Expression stringParam = this.ConcatExpression(constantExpression, keyExpr);

            var bodyExpr = Expression.Block(
                this.CallStringBuilderAppend(context.SqlExpression, stringParam),
                this.CallAddParameters(context.ParametersExpression, keyExpr, memberExpression)
                );

            if (propertyType == typeof(string) || propertyType.IsGenericType)
            {
                return(Expression.IfThen(Expression.NotEqual(memberExpression, Expression.Constant(null)), bodyExpr));
            }

            return(bodyExpr);
        }
Esempio n. 2
0
        protected override Expression GetWhereClause(Context context, PropertyInfo queryProperty)
        {
            string propertyName = queryProperty.Name.Substring(0, queryProperty.Name.Length - Suffix.Length);
            string columnName   = this.GetColumnName(context.ModelType, propertyName);

            var memberExpression = Expression.Property(context.QueryExpression, queryProperty);
            var keyExpr          = Expression.Constant($"@{propertyName}{Suffix}");

            var options        = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(context.Analyzer);
            var startDelimiter = options.StartDelimiter;
            var endDelimiter   = options.EndDelimiter;

            var stringParam = this.ConcatExpression(
                Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} IN "),
                keyExpr);

            var notNullExpr = Expression.NotEqual(memberExpression, Expression.Constant(null));
            var lenExpr     = Expression.GreaterThan(Expression.ArrayLength(memberExpression), Expression.Constant(0));

            var bodyExpr = Expression.Block(
                this.CallStringBuilderAppend(context.SqlExpression, stringParam),
                this.CallAddParameters(context.ParametersExpression, keyExpr, memberExpression)
                );

            return(Expression.Block(Expression.IfThen(
                                        Expression.AndAlso(notNullExpr, lenExpr),
                                        bodyExpr)));
        }
Esempio n. 3
0
        public static TableDescriptor GetTableDescriptor(Type typeOfModel)
        {
            var table   = GetTable(typeOfModel);
            var cols    = GetColumnDescriptors(typeOfModel);
            var options = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(table.Analyzer);

            var tableDescriptor = new TableDescriptor
            {
                TableName         = table.Name,
                Analyzer          = table.Analyzer,
                Db                = table.Db,
                ColumnDescriptors = cols,
                Options           = options
            };

            return(tableDescriptor);
        }
Esempio n. 4
0
        protected static string BuildSort <T>(IQuery <T> query)
        {
            var analyzer = TableCache.GetDialect(typeof(T));
            var sb       = new StringBuilder();

            if (query.OrderBys != null)
            {
                var len = query.OrderBys.Count;
                if (len > 0)
                {
                    sb.Append(" ORDER BY");
                }

                var cols = TableCache.GetColumnDescriptors(typeof(T));
                for (var index = 0; index < len; index++)
                {
                    var sort = query.OrderBys[index];
                    if (cols.All(n => n.DbName != sort.OrderField))
                    {
                        throw new ArgumentException("query.OrderBys OrderField Not Exist");
                    }

                    var options        = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(analyzer);
                    var startDelimiter = options.StartDelimiter;
                    var endDelimiter   = options.EndDelimiter;

                    sb.Append($" {startDelimiter}{sort.OrderField}{endDelimiter} {sort.OrderDirection}");
                    if (index != len - 1)
                    {
                        sb.Append(",");
                    }
                }

                return(sb.ToString());
            }

            return(string.Empty);
        }
Esempio n. 5
0
        protected override Expression GetWhereClause(Context context, PropertyInfo queryProperty)
        {
            string str = queryProperty.Name.Substring(0, queryProperty.Name.Length - Suffix.Length);
            var    memberExpression = Expression.Property(context.QueryExpression, queryProperty);

            var options        = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(context.Analyzer);
            var startDelimiter = options.StartDelimiter;
            var endDelimiter   = options.EndDelimiter;

            Expression keyExpr     = Expression.Constant($"@{queryProperty.Name}");
            Expression stringParam = this.ConcatExpression(
                Expression.Constant($" AND {startDelimiter}{str}{endDelimiter} like "),
                keyExpr);

            var likeExpr = ConcatExpression(Expression.Constant("%"), memberExpression, Expression.Constant("%"));
            var bodyExpr = Expression.Block(
                this.CallStringBuilderAppend(context.SqlExpression, stringParam),
                this.CallAddParameters(context.ParametersExpression, keyExpr, likeExpr)
                );

            return(Expression.IfThen(
                       Expression.NotEqual(memberExpression, Expression.Constant(null)),
                       bodyExpr));
        }
Esempio n. 6
0
        protected override Expression GetWhereClause(Context context, PropertyInfo queryProperty)
        {
            string targetModelPropertyName = queryProperty.Name.Substring(0, queryProperty.Name.Length - Suffix.Length);
            var    type = context.ModelProperties.FirstOrDefault(x => x.Name == targetModelPropertyName)?.PropertyType;

            if (type == null)
            {
                throw new ArgumentException("ModelProperties Not Exist Range Name ");
            }

            if (type.IsGenericType)
            {
                type = type.GetGenericArguments().First();
            }

            var columnName = this.GetColumnName(context.ModelType, targetModelPropertyName);

            var options        = SqlDatabaseOptionsFactory.GetSqlDatabaseOptions(context.Analyzer);
            var startDelimiter = options.StartDelimiter;
            var endDelimiter   = options.EndDelimiter;

            var type2            = typeof(Range <>).MakeGenericType(type);
            var returnType       = typeof(Nullable <>).MakeGenericType(type);
            var hasValueProperty = returnType.GetProperty("HasValue") ?? throw new InvalidOperationException();
            var valueProperty    = returnType.GetProperty("Value") ?? throw new InvalidOperationException();

            var rangeExpr = Expression.Property(context.QueryExpression, queryProperty);
            var leftExpr  = Expression.Property(rangeExpr,
                                                type2.GetProperty("Left", returnType) ?? throw new InvalidOperationException());
            var leftExclusiveExpre = Expression.Property(rangeExpr,
                                                         type2.GetProperty("LeftExclusive") ?? throw new InvalidOperationException());
            var rightExpr = Expression.Property(rangeExpr,
                                                type2.GetProperty("Right", returnType) ?? throw new InvalidOperationException());
            var rightExclusiveExpr = Expression.Property(rangeExpr,
                                                         type2.GetProperty("RightExclusive") ?? throw new InvalidOperationException());

            var expressionList = new List <Expression>();

            var stringParam1 = this.ConcatExpression(
                Expression.Condition(leftExclusiveExpre,
                                     Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} > "),
                                     Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} >= ")),
                Expression.Constant($"@{columnName}Left")
                );

            var leftBodyExpr = Expression.Block(this.CallStringBuilderAppend(context.SqlExpression, stringParam1),
                                                this.CallAddParameters(context.ParametersExpression, Expression.Constant($"@{columnName}Left"),
                                                                       Expression.Property(leftExpr, valueProperty)));

            expressionList.Add(Expression.IfThen(
                                   Expression.AndAlso(
                                       Expression.NotEqual(leftExpr,
                                                           Expression.Constant(null)),
                                       Expression.Property(leftExpr, hasValueProperty)), leftBodyExpr
                                   ));

            var stringParam2 = this.ConcatExpression(
                Expression.Condition(rightExclusiveExpr,
                                     Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} < "),
                                     Expression.Constant($" AND {startDelimiter}{columnName}{endDelimiter} <= ")),
                Expression.Constant($"@{columnName}Right"));

            var rightBodyExpr = Expression.Block(this.CallStringBuilderAppend(context.SqlExpression, stringParam2),
                                                 this.CallAddParameters(context.ParametersExpression, Expression.Constant($"@{columnName}Right"),
                                                                        Expression.Property(rightExpr, valueProperty)));

            expressionList.Add(Expression.IfThen(
                                   Expression.AndAlso(
                                       Expression.NotEqual(rightExpr,
                                                           Expression.Constant(null)),
                                       Expression.Property(rightExpr, hasValueProperty)), rightBodyExpr
                                   ));

            return(Expression.IfThen(
                       Expression.NotEqual(rangeExpr,
                                           Expression.Constant(null)),
                       Expression.Block(expressionList)));
        }