【问题标题】:Creating dynamic queries using ParameterExpression in Odata Client在 Odata 客户端中使用 ParameterExpression 创建动态查询
【发布时间】:2016-07-17 12:30:42
【问题描述】:

我正在使用 Odata 客户端代码生成器代理类使用 Odata v4 服务。

MetroContext = new MetroContainer(new Uri(@"http://localhost:56222/service"));
IQueryable<Patient> query = MetroContext.Patients;
query = query.Where(x => x.FirstName == "john");

以上代码运行良好。但我需要动态构建查询。所以我尝试了以下方法:

MetroContext = new MetroContainer(new Uri(@"http://localhost:56222/service"));
IQueryable<Patient> query = MetroContext.Patients;

ParameterExpression pe = Expression.Parameter(typeof(Patient), "patient");
Expression left = Expression.Property(pe, "FirstName");
Expression right = Expression.Constant("john");
Expression predicateBody = Expression.Equal(left, right);

query = query.Provider.CreateQuery<Patient>(predicateBody);

当我运行程序时,我收到一条错误消息:

将 Linq 表达式转换为 URI 时出错:二元运算符“Equal” 不支持。

  • 为什么会出现此错误,我该如何解决?
  • 如何通过组合Contains()、StartsWith()等方法创建动态查询?

【问题讨论】:

    标签: c# linq odata iqueryable odata-v4


    【解决方案1】:

    我无法测试该特定查询提供程序,但首先predicateBody 不是任何提供程序的有效表达式。

    相反,您需要构建Expression&lt;Func&lt;Patient, bool&gt;&gt; 表达式并将其传递给Where 方法,如下所示:

    // ...
    var predicate = Expression.Lambda<Func<Patient, bool>>(predicateBody, pe);
    query = query.Where(predicate);
    

    你的第二个问题呢,你需要使用一些Expression.Call 重载。例如:

    Expression predicateBody = Expression.Call(left, "Contains", null, right);
    

    “StartsWith”和“EndWith”等类似

    【讨论】:

    • 谢谢,它运行良好。还有一个问题,我可以在Expression.Call()方法中使用Equal、GreaterThan比较吗?
    • 没有。 Call 用于方法。当然,您可以在方法参数中使用Equal、GreaterThan 等(用于条件)。有具体的例子吗?
    • 我可以用Expression.Call(left, "NotEqual", null, right) 之类的东西替换代码Expression.NotEqual(left, right) 吗?
    • 没有。这些是运算符,而不是方法。
    • @Matt 不确定这个问题。如果您对“正常” PredicateBuilder 有疑问,您可以查看我对Establish a link between two lists in linq to entities where clause 或Universal PredicateBuilder 的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2021-09-05
    • 1970-01-01
    • 2020-03-15
    • 2014-06-16
    相关资源
    最近更新 更多