1

我正在使用 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()
4

1 回答 1

2

我无法测试该特定查询提供程序,但首先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”等类似。

于 2016-03-29T19:24:16.040 回答