Пример #1
0
        protected virtual void SetCommand(bool clearQueryHints)
        {
            if (QueryNumber == 0 && (DataContext.QueryHints.Count > 0 || DataContext.NextQueryHints.Count > 0))
            {
                var queryContext = Query.Queries[QueryNumber];

                queryContext.QueryHints = new List <string>(DataContext.QueryHints);
                queryContext.QueryHints.AddRange(DataContext.NextQueryHints);

                if (QueryHints == null)
                {
                    QueryHints = new List <string>(DataContext.QueryHints.Count + DataContext.NextQueryHints.Count);
                }

                QueryHints.AddRange(DataContext.QueryHints);
                QueryHints.AddRange(DataContext.NextQueryHints);

                if (clearQueryHints)
                {
                    DataContext.NextQueryHints.Clear();
                }
            }

            var parameterValues = new SqlParameterValues();

            QueryRunner.SetParameters(Query, Expression, DataContext, Parameters, QueryNumber, parameterValues);

            SetQuery(parameterValues);
        }
Пример #2
0
        static int EvaluateTakeSkipValue(Query query, Expression expr, IDataContext?db, object?[]?ps, int qn,
                                         ISqlExpression sqlExpr)
        {
            var parameterValues = new SqlParameterValues();

            SetParameters(query, expr, db, ps, qn, parameterValues);

            var evaluated = sqlExpr.EvaluateExpression(new EvaluationContext(parameterValues)) as int?;

            if (evaluated == null)
            {
                throw new InvalidOperationException($"Can not evaluate integer expression from '{sqlExpr}'.");
            }
            return(evaluated.Value);
        }
Пример #3
0
        internal static void SetParameters(
            Query query, Expression expression, IDataContext?parametersContext, object?[]?parameters, int queryNumber, SqlParameterValues parameterValues)
        {
            var queryContext = query.Queries[queryNumber];

            foreach (var p in queryContext.ParameterAccessors)
            {
                var value = p.ValueAccessor(expression, parametersContext, parameters);

                if (value is IEnumerable vs)
                {
                    var type  = vs.GetType();
                    var etype = type.GetItemType();

                    if (etype == null || etype == typeof(object) || etype.IsEnum ||
                        type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>) &&
                        etype.GetGenericArguments()[0].IsEnum)
                    {
                        var values = new List <object?>();

                        foreach (var v in vs)
                        {
                            value = v;

                            if (v != null)
                            {
                                var valueType = v.GetType();

                                if (valueType.ToNullableUnderlying().IsEnum)
                                {
                                    value = query.GetConvertedEnum(valueType, v);
                                }
                            }

                            values.Add(value);
                        }

                        value = values;
                    }
                }

                var dbDataType = p.DbDataTypeAccessor(expression, parametersContext, parameters);

                parameterValues.AddValue(p.SqlParameter, value, p.SqlParameter.Type.WithSetValues(dbDataType));
            }
        }