Как создать динамическое выражение «содержит или НРАВИТСЯ» для использования с Linq против службы OData - PullRequest
4 голосов
/ 02 августа 2011

Я пытаюсь создать инструмент динамического запроса, используя System.Linq.Expressions.Expression (WPF / c # 4.0). Он работает с OData Service.

Пока все работает какПока я ограничиваю условия для встраивания опций, таких как Equal (..), GreaterThan (..) и т. д. Кажется, что нет условий в build / Like, поэтому я попытался создать свои собственные.Есть несколько статей уже там.Я попробовал Как создать System.Linq.Expressions.Expression для Like? .

Теперь, если я воспользуюсь приведенным выше решением, полученное выражение где равно

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». Кроме того, поскольку код, используемый для построения выражений, работает с любым из условий встраивания,Я полагаю, сейчас эта часть в порядке.Я могу разместить его части, если это необходимо

1 Ответ

1 голос
/ 02 августа 2011

OData в настоящее время вообще не поддерживает оператор like.Поэтому независимо от того, что вы делаете на клиенте, созданный URL не может это выразить.Подстрокаof поддерживается, и поставщик LINQ клиента должен генерировать ее, когда вы используете метод string.Contains в выражении фильтра (Where).

Чтобы получить выражение, сгенерированное компилятором C #, вы можете сделать что-то вроде этого:1003 *

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 могут несколько изменить дерево выражений по сравнению с исходным, созданным компилятором, но большинству следует оставить его близким к исходному.

...