コード例 #1
0
        public object Execute <TResult>(string sql, object[] variables, QueryResultMethod queryResultMethod)
        {
            if (queryResultMethod == QueryResultMethod.Delete)
            {
                Db.SlowSQL(sql, variables);
                return(null);
            }
            Type resultType = typeof(TResult);

            if (resultType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(resultType))
            {
                Type resultItemType = resultType.GetGenericArguments().FirstOrDefault();
                if (resultItemType != null)
                {
                    IEnumerable <object> queryResult     = Db.SlowSQL(sql, variables);
                    MethodInfo           castItemsMethod = ReflectionHelper.GetEnumerableCastMethod(resultItemType);
                    return((TResult)castItemsMethod.Invoke(null, new object[] { queryResult }));
                }

                return(Db.SlowSQL <T>(sql, variables));
            }

            var result = Query(sql, variables, queryResultMethod);

            if (result == null)
            {
                return(default(TResult));
            }

            return((TResult)CastHelper.Convert(result, resultType));
        }
コード例 #2
0
        public object GetQueryResult(string sql, object[] variables, QueryResultMethod queryResultMethod)
        {
            var queryResult = Db.SlowSQL(sql, variables);

            switch (queryResultMethod)
            {
            case QueryResultMethod.FirstOrDefault:
                return(queryResult.FirstOrDefault());

            case QueryResultMethod.First:
                return(queryResult.First());

            case QueryResultMethod.SingleOrDefault:
                return(queryResult.SingleOrDefault());

            case QueryResultMethod.Single:
                return(queryResult.Single());

            case QueryResultMethod.Any:
                return(queryResult.Any());

            case QueryResultMethod.All:
                throw new NotSupportedException();

            default:
                throw new ArgumentOutOfRangeException(nameof(queryResultMethod), queryResultMethod, null);
            }
        }
コード例 #3
0
        /// <summary>
        /// This API supports the Entity Framework Core infrastructure and is not intended to be used
        /// directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public CompiledQuery(LambdaExpression queryExpression, IQueryExecutor queryExecutor)
        {
            QueryExecutor = queryExecutor ?? throw new ArgumentNullException(nameof(queryExecutor));

            Type contextType;

            switch (queryExpression.Body)
            {
            case MethodCallExpression methodCall:
                if (methodCall.Arguments.Any() && methodCall.Arguments[0] is MethodCallExpression methodCallExpression)
                {
                    contextType = methodCallExpression.Type.GenericTypeArguments[0];
                }
                else
                {
                    contextType = methodCall.Object?.Type.GenericTypeArguments.FirstOrDefault() ?? methodCall.Type;
                }
                break;

            default:
                throw new NotSupportedException();
            }

            TranslatedQuery translatedQuery;

            if (contextType == null)
            {
                var q = new DummyQueryContext <T>();
                translatedQuery = q.GetQuery(queryExpression.Body);
            }
            else
            {
                var queryContextType = typeof(DummyQueryContext <>).MakeGenericType(contextType);
                var q          = Activator.CreateInstance(queryContextType);
                var methodInfo = queryContextType.GetMethod(nameof(DummyQueryContext <object> .GetQuery));
                if (methodInfo == null)
                {
                    throw new MissingMethodException();
                }
                translatedQuery = (TranslatedQuery)methodInfo.Invoke(q, new object[] { queryExpression.Body });
            }
            SqlStatement      = translatedQuery.SqlStatement;
            QueryResultMethod = translatedQuery.ResultMethod;
        }
コード例 #4
0
        public object Execute <TResult>(string sql, object[] variables, QueryResultMethod queryResultMethod)
        {
            if (queryResultMethod == QueryResultMethod.Delete)
            {
                Db.SlowSQL(sql, variables);
                return(null);
            }

            if (typeof(IEnumerable).IsAssignableFrom(typeof(TResult)))
            {
                return(Db.SlowSQL <T>(sql, variables));
            }

            var result = GetQueryResult(sql, variables, queryResultMethod);

            if (result == null)
            {
                return(default(TResult));
            }

            result = DeliftQueryResult(result, typeof(TResult));

            return((TResult)result);
        }