![](/img/trans.png)
[英]Creating dynamic linq expression OData for multiple conditions for filter Contains?
[英]How to create a dynamic 'contains or LIKE' Expression to be used with Linq against OData service
我嘗試使用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<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提供程序可能會稍微改變表達式樹與編譯器創建的原始表達式,但大多數應該使它接近原始表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.