c# – 如何创建动态“包含或LIKE”表达式,以便与Linq一起使用ODa
我尝试使用System.
Linq.Expressions.Expression(WPF / c#4.0)创建动态查询工具
它针对OData服务运行. 到目前为止,只要我限制条件来构建Equal(..),GreaterThan(..)等选项,所有这些都有效. 现在如果我使用上面的解决方案,结果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<string> source = new List<string>().AsQueryable(); IQueryable<string> result = from item in source where item.Contains("John") select item; Console.WriteLine(result.Expression.ToString()); 基本上任何IQueryable都有一个属性Expression,它包含要运行的查询的表达式树.一些LINQ提供程序可能会稍微改变表达式树与编译器创建的原始表达式,但大多数应该使它接近原始表达式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |