gpt4 book ai didi

c# - 如何创建动态 'contains or LIKE' 表达式以与 Linq 针对 OData 服务一起使用

转载 作者:行者123 更新时间:2023-12-02 05:17:26 24 4
gpt4 key购买 nike

我尝试使用 System.Linq.Expressions.Expression (WPF/c#4.0) 创建动态查询工具它针对 OData 服务运行。

到目前为止,只要我限制构建 Equal(..)、GreaterThan(..) 等选项的条件,一切都正常。似乎没有构建包含/类似条件,所以我尝试构建自己的。已经有一些文章了。我尝试过的一个是 How to create a System.Linq.Expressions.Expression for Like? .

现在,如果我使用上述解决方案,得到的 where 表达式为

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'

这很好,但错误,因为它没有转换为有效的 Odata 查询。

如果我使用条件“等于”,结果是

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,并且当您在过滤器 (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 提供程序可能会对编译器创建的原始表达式树进行一些更改,但大多数提供程序应使其接近原始表达式树。

关于c# - 如何创建动态 'contains or LIKE' 表达式以与 Linq 针对 OData 服务一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6907103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com