static IQueryBuilder <TRecord> AddInExpression <TRecord>(ArraySqlOperand operand, IQueryBuilder <TRecord> queryBuilder, MethodCallExpression call) where TRecord : class
        {
            var property = GetProperty(call.Arguments[0]);
            var value    = (IEnumerable)GetValueFromExpression(call.Arguments[1], property.PropertyType);

            return(queryBuilder.Where(property.Name, operand, value));
        }
        /// <summary>
        /// Adds an array based where clause expression to the query.
        /// </summary>
        /// <typeparam name="TRecord">The record type of the query builder</typeparam>
        /// <param name="queryBuilder">The query builder</param>
        /// <param name="fieldName">The name of one of the columns in the query. The where condition will be evaluated against the value of this column.</param>
        /// <param name="operand">The SQL operator to be used in the where clause</param>
        /// <param name="values">The values to compare against the column values. Each value will be added to the query as a separate parameter.</param>
        /// <returns>The query builder that can be used to further modify the query, or execute the query</returns>
        public static IQueryBuilder <TRecord> Where <TRecord>(this IQueryBuilder <TRecord> queryBuilder, string fieldName,
                                                              ArraySqlOperand operand, IEnumerable values) where TRecord : class
        {
            var stringValues = values.OfType <object>().Select(v => v.ToString()).ToArray();
            var parameters   = stringValues.Select((v, i) => new Parameter($"{fieldName}{i}")).ToArray();

            return(queryBuilder.WhereParameterised(fieldName, operand, parameters)
                   .ParameterValues(stringValues));
        }
        /// <summary>
        /// Adds an array based where clause expression to the query.
        /// </summary>
        /// <typeparam name="TRecord">The record type of the query builder</typeparam>
        /// <param name="queryBuilder">The query builder</param>
        /// <param name="fieldName">The name of one of the columns in the query. The where condition will be evaluated against the value of this column.</param>
        /// <param name="operand">The SQL operator to be used in the where clause</param>
        /// <param name="values">The values to compare against the column values. Each value will be added to the query as a separate parameter.</param>
        /// <returns>The query builder that can be used to further modify the query, or execute the query</returns>
        [Pure] public static IQueryBuilder <TRecord> Where <TRecord>(this IQueryBuilder <TRecord> queryBuilder, string fieldName,
                                                                     ArraySqlOperand operand, IEnumerable values) where TRecord : class
        {
            var valuesList = values.OfType <object>().ToList();

            ListExtender.ExtendListRepeatingLastValue(valuesList);

            var parameters = valuesList.Select((v, i) => new Parameter($"{fieldName}{i + 1}")).ToArray();

            return(queryBuilder.WhereParameterized(fieldName, operand, parameters).ParameterValues(valuesList));
        }
Example #4
0
 public ArrayWhereParameter(string fieldName, ArraySqlOperand operand, IReadOnlyList <Parameter> parameterNames)
 {
     this.parameterNames = parameterNames;
     FieldName           = fieldName;
     Operand             = operand;
 }
Example #5
0
        public IArrayParametersQueryBuilder <TRecord> WhereParameterised(string fieldName, ArraySqlOperand operand,
                                                                         IEnumerable <Parameter> parameterNames)
        {
            var parameterNamesList = parameterNames.Select(p => new UniqueParameter(uniqueParameterNameGenerator, p)).ToList();

            if (!parameterNamesList.Any())
            {
                return(new ArrayParametersQueryBuilder <TRecord>(AddAlwaysFalseWhere(), parameterNamesList));
            }
            selectBuilder.AddWhere(new ArrayWhereParameter(fieldName, operand, parameterNamesList));
            IQueryBuilder <TRecord> builder = this;

            return(new ArrayParametersQueryBuilder <TRecord>(parameterNamesList.Aggregate(builder, (b, p) => b.Parameter(p)), parameterNamesList));
        }
Example #6
0
 public IArrayParametersQueryBuilder <TRecord> WhereParameterised(string fieldName, ArraySqlOperand operand,
                                                                  IEnumerable <Parameter> parameterNames)
 {
     return(Builder.WhereParameterised(fieldName, operand, parameterNames));
 }
Example #7
0
 public ArrayWhereClause(IWhereFieldReference whereFieldReference, ArraySqlOperand operand, IEnumerable <string> parameterNames)
 {
     this.whereFieldReference = whereFieldReference;
     this.operand             = operand;
     this.parameterNames      = parameterNames;
 }
        public IArrayParametersDeleteQueryBuilder <TRecord> WhereParameterised(string fieldName, ArraySqlOperand operand,
                                                                               IEnumerable <Parameter> parameterNames)
        {
            var parameterNamesList = parameterNames.Select(p => new UniqueParameter(uniqueParameterNameGenerator, p)).ToList();

            if (!parameterNamesList.Any())
            {
                return(new ArrayParametersDeleteQueryBuilder <TRecord>(AddWhereClause(AlwaysFalseWhereClause()), parameterNamesList));
            }

            return(new ArrayParametersDeleteQueryBuilder <TRecord>(
                       AddWhereClause(new ArrayWhereClause(new WhereFieldReference(fieldName), operand, parameterNamesList.Select(p => p.ParameterName).ToList())),
                       parameterNamesList));
        }