Come creare un'espressione 'contains o LIKE' dinamica da utilizzare con Linq contro il servizio OData

c# expression-trees linq odata

Domanda

Sto provando a creare uno strumento di query dinamico utilizzando System.Linq.Expressions.Expression (WPF / c # 4.0) Viene eseguito su un servizio OData.

Finora, tutto funziona a patto che limiti le condizioni per creare opzioni come Equal (..), GreaterThan (..) ecc. Sembra che non ci siano build in contiene / condizioni simili, quindi ho provato a creare il mio. Ci sono già una manciata di articoli là fuori. Quello che ho provato è come creare un System.Linq.Expressions.Expression per Like? .

Ora se uso la soluzione di cui sopra, l'espressione dov'è risultante

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

che è bello, ma sbagliato, dal momento che non si traduce in una query Odata valida.

Se utilizzo la condizione "Uguale", il risultato è

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

quale risulta nella query OData

results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B} 

e sta funzionando come previsto.

Sto facendo qualcosa di sbagliato con l'implementazione della soluzione, o non può essere utilizzato con OData?

Dovrebbe trasferire qualcosa come ...?$filter=substringof('te', LastName ) eq true

Qualche soluzione su come risolvere questo problema?

Saluti

Andreas

PS, ho implementato l'estensione della soluzione in una classe statica, tutto ciò che ho cambiato è il nome del metodo chiamato da 'Mi piace' a 'MyLike' Inoltre, poiché il codice utilizzato per costruire le espressioni sta funzionando con qualsiasi condizione di build-in , Suppongo, per ora quella parte è ok. Posso postarne alcune parti se necessario

Risposta accettata

Attualmente OData non supporta affatto l'operatore "mi piace". Quindi, indipendentemente da ciò che fai sul client, l'URL prodotto non ha modo di esprimerlo. La sottostringa di supporto è supportata e il provider LINQ client deve generarlo quando si utilizza il metodo string.Contains nell'espressione del filtro (Where).

Per ottenere l'espressione generata da un compilatore C # puoi fare qualcosa del genere:

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());

Fondamentalmente qualsiasi IQueryable ha una espressione di proprietà che contiene l'albero delle espressioni per l'esecuzione della query. Alcuni provider LINQ potrebbero modificare l'albero delle espressioni in qualche modo da quello originale creato dal compilatore, ma la maggior parte dovrebbe lasciarlo vicino all'originale.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché