簡體   English   中英

如何創建一個動態的“包含或LIKE”表達式,以便與Linq對抗OData服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM