如何创建一个动态的“包含或LIKE”表达式,以便与Linq一起使用OData服务
我尝试使用System.Linq.Expressions.Expression(WPF / c#4.0)创建动态查询工具。它针对OData服务运行。
到目前为止,只要我限制条件构建在Equal(..),GreaterThan(..)等选项中,所有这些都是有效的。似乎没有构建contains / Like条件,所以我尝试构建自己的。 那里已经有一些文章了。 我试过的一个是如何为Like创建一个System.Linq.Expressions.Expression? 。
现在,如果我使用上面的解决方案,结果where表达式
whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'
这很好,但错了,因为它没有转化为有效的Odata查询。
如果我使用条件’Equal’,结果是
whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => (clt.LastName == "te"))}
这导致OData查询
results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B}
并按预期工作。
我是否在解决方案的实施方面出了问题,或者它不能与OData一起使用?
它应该转移到类似...?$filter=substringof('te', LastName ) eq true
有关如何解决此问题的任何解决方案
问候
安德烈亚斯
PS,我在静态类中实现了解决方案扩展,我改变的是从’Like’到’MyLike’的被调用方法的名称。此外,因为用于构建表达式的代码适用于任何内置条件,我想,现在这部分还可以。 如果需要,我可以发布部分内容
OData目前根本不支持“like”运算符。 因此,无论您在客户端执行什么操作,生成的URL都无法表达。 支持substringof,当您在filter(Where)表达式中使用string.Contains方法时,客户端LINQ提供程序应该生成它。
要获取C#编译器生成的表达式,您可以执行以下操作:
IQueryable source = new List ().AsQueryable(); IQueryable result = from item in source where item.Contains("John") select item; Console.WriteLine(result.Expression.ToString());
基本上任何IQueryable都有一个属性Expression,它包含要运行的查询的表达式树。 一些LINQ提供程序可能会稍微改变表达式树与编译器创建的表达式树,但大多数应该使它接近原始树。