繁体   English   中英

在Odata Client中使用ParameterExpression创建动态查询

[英]Creating dynamic queries using ParameterExpression in Odata Client

我正在使用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()方法创建动态查询?

我无法测试该特定查询提供程序,但首先, predicateBody对任何提供程序都不有效。

相反,您需要构建Expression<Func<Patient, bool>>表达式并将其传递给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”等类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM