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