自定义IQueryProvider中的ArgumentNullException

时间:2018-12-06 12:34:08

标签: c# asp.net-web-api iqueryable argumentnullexception iqueryprovider

首先了解一些背景,以了解为什么我尝试创建自定义console.log('executing'); aObj(".woocommerce-ordering").on("change", "select.orderby", function() { aObj(this).closest("form").submit() }), aObj("div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)").addClass("buttons_added").append('<span class="minus"><i class="fa fa-minus" aria-hidden="true"></i></span>').prepend('<span class="plus"><i class="fa fa-plus" aria-hidden="true"></i></span>'), aObj("input.qty:not(.product-quantity input.qty)").each(function() { var b = parseFloat(aObj(this).attr("min")); b && b > 0 && parseFloat(aObj(this).val()) < b && aObj(this).val(b) }), aObj(document).on("click", ".plus, .minus", function() { var b = aObj(this).closest(".quantity").find(".qty"), c = parseFloat(b.val()), d = parseFloat(b.attr("max")), e = parseFloat(b.attr("min")), f = b.attr("step"); c && "" !== c && "NaN" !== c || ( c = 0), ("" === d || "NaN" === d) && ( d = ""), ("" === e || "NaN" === e) && ( e = 0), ("any" === f || "" === f || void 0 === f || "NaN" === parseFloat(f)) && ( f = 1), aObj(this).is(".plus") ? b.val(d && (d == c || c > d) ? d : c + parseFloat(f)) : e && (e == c || e > c) ? b.val(e) : c > 0 && b.val(c - parseFloat(f)), b.trigger("change") }) } jQuery(function(a) { aObj=a; addPlusMinusIcons(); });

我正在寻找一种支持IQueryProvider的通用OData客户端的解决方案。我不想使用OData客户端代码生成器(因为我不想在每次更改服务器时都更新客户端或创建新客户端)。我有一个基于IQueryable的默认Web API调用的实现,我想将其重用于OData。我的服务已经支持OData,并且工作正常。在客户端,我现在需要一个WebClient才能将其分配给DevExpress的IQueryable

我的问题是我需要执行HTTP请求以获取ODataInstantFeedbackSource。这将导致OData查询不受任何限制,从而导致加载大量数据。因此,我的想法是创建某种“委托查询”,该委托在其构造函数中使用一个IQueryable委托,该委托定义了对Web API的调用,还可以处理表达式树。

我对该解决方案的尝试(示例项目):

Func

我收到以下异常:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

namespace IQueryableTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = new FuncQueryable<int>((expr) =>
            {
                return new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }
                    .AsQueryable()
                    .Provider
                    .CreateQuery<int>(expr);
            });

            var y = x.Where(i => i % 2 == 0);
            var z = y.ToList();
        }
    }

    public class FuncQueryable<T> : IOrderedQueryable<T>
    {
        public FuncQueryable(Func<Expression, IQueryable<T>> source)
        {
            Provider = new ActionQueryProvider<T>(source);
        }

        public FuncQueryable(IQueryProvider provider, Expression expression)
        {
            Provider = provider;
            Expression = expression;
        }

        public Expression Expression { get; set; }

        public Type ElementType => typeof(T);

        public IQueryProvider Provider { private set; get; }

        public IEnumerator<T> GetEnumerator()
        {
            return (Provider.Execute<IEnumerable<T>>(Expression)).GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return (Provider.Execute<IEnumerable>(Expression)).GetEnumerator();
        }
    }

    public class ActionQueryProvider<T> : IQueryProvider
    {
        private readonly Func<Expression, IQueryable<T>> _source;

        public ActionQueryProvider(Func<Expression, IQueryable<T>> source)
        {
            _source = source;
        }

        public IQueryable CreateQuery(Expression expression)
        {
            return new FuncQueryable<T>(this, expression);
        }

        public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
        {
            return new FuncQueryable<TElement>(this, expression);
        }

        public object Execute(Expression expression)
        {
            return _source.Invoke(expression);
        }

        public TResult Execute<TResult>(Expression expression)
        {
            return (TResult)Execute(expression);
        }
    }
}

Der Wert darf nicht NULL sein. (ArgumentNullException) Parametername: arguments bei System.Linq.Expressions.Expression.RequiresCanRead(Expression expression, String paramName) bei System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi) bei System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments) bei System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) bei System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate) bei IQueryableTest.Program.Main(String[] args) 行。

0 个答案:

没有答案