在 Odata 客户端中使用 ParameterExpression 创建动态查询
Creating dynamic queries using ParameterExpression in Odata Client
我正在使用 Odata 客户端代码生成器代理使用 Odata v4 服务 class。
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);
当我 运行 程序时,我收到一条错误消息:
Error translating Linq expression to URI: The binary operator 'Equal'
is not supported.
- 为什么我会收到这个错误,我该如何解决?
- 如何通过组合
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" 等
我正在使用 Odata 客户端代码生成器代理使用 Odata v4 服务 class。
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);
当我 运行 程序时,我收到一条错误消息:
Error translating Linq expression to URI: The binary operator 'Equal' is not supported.
- 为什么我会收到这个错误,我该如何解决?
- 如何通过组合
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" 等