public object Execute(Expression expression) { var visitor = new SalesforceVisitor(NamingConvention, SelectType); var cmd = visitor.Translate(PartialEvaluator.Eval(expression)); switch (visitor.QueryType) { case QueryTypeEnum.FirstOrDefault: return(ProduceAsyncEnumerable(cmd).FirstOrDefault()); case QueryTypeEnum.First: return(ProduceAsyncEnumerable(cmd).First()); case QueryTypeEnum.Single: return(ProduceAsyncEnumerable(cmd).Single()); case QueryTypeEnum.SingleOrDefault: return(ProduceAsyncEnumerable(cmd).SingleOrDefault()); case QueryTypeEnum.Count: return(ProduceCountAsync(cmd)); case QueryTypeEnum.Any: return(ProduceCountAsync(cmd).ContinueWith(task => task.Result > 0)); case QueryTypeEnum.List: return(ProduceAsyncEnumerable(cmd).ToList()); // var argument = typeof(TResult).GetGenericArguments()[0]; // // var method = GetType().GetMethod("ProduceAsyncEnumerable", BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(argument); // var asyncEnumerable = method.Invoke(this, new object[]{cmd}); // // // var enumerabletype = typeof(IAsyncEnumerable<>).MakeGenericType(argument); // var toList = GetGenericMethod(typeof(AsyncEnumerable), "ToList", typeof(IAsyncEnumerable<>)).MakeGenericMethod(argument); // // var result = (Task<TResult>) toList.Invoke(null, new [] {asyncEnumerable}); // // MethodInfo GetGenericMethod(Type type, string name, params Type[] argumentTypes) // { // var methods = type.GetTypeInfo().GetMember("ToList").OfType<MethodInfo>().ToList(); // // return methods.FirstOrDefault(m => // { // var parameters = m.GetParameters(); // // if (parameters.Length != argumentTypes.Length) // return false; // // for (var i = 0; i < parameters.Length; i++) // { // var parameterType = parameters[i].ParameterType; // // if (parameterType.IsGenericType) // parameterType = parameterType.GetGenericTypeDefinition(); // // if (parameterType != argumentTypes[i]) // return false; // } // // return true; // }); // } case QueryTypeEnum.Enumerator: default: return(Task.FromResult(ProduceAsyncEnumerator(cmd))); } }
public string ToString(Expression expression) { var visitor = new SalesforceVisitor(NamingConvention, SelectType); return(visitor.Translate(PartialEvaluator.Eval(expression))); }