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