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); }
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))); }
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); }
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); }
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)); }
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))); }