2016-03-29 4 views
1

Я использую службу Odata v4 с использованием прокси-класса генератора кода Odata.Создание динамических запросов с использованием ParameterExpression в Odata Client

MetroContext = new MetroContainer(new Uri(@"http://localhost:56222/service")); 
IQueryable<Patient> query = MetroContext.Patients; 
query = query.Where(x => x.FirstName == "john"); 

Над кодом работает нормально. Но мне нужно строить запросы динамически. Так что я попытался следующее:

MetroContext = new MetroContainer(new Uri(@"http://localhost:56222/service")); 
IQueryable<Patient> query = MetroContext.Patients; 

ParameterExpression pe = Expression.Parameter(typeof(Patient), "patient"); 
Expression left = Expression.Property(pe, "FirstName"); 
Expression right = Expression.Constant("john"); 
Expression predicateBody = Expression.Equal(left, right); 

query = query.Provider.CreateQuery<Patient>(predicateBody); 

Когда я запускаю программу, я получаю сообщение об ошибке:

Ошибка перевод выражения Linq к URI: Бинарный оператор «Равно» не поддерживается.

  • Почему я получаю эту ошибку и как я могу решить эту проблему?
  • Как создать динамические запросы путем объединения таких методов, как Contains(), StartsWith()?

ответ

2

Я не могу проверить этот поставщик конкретных запросов, но на первом месте predicateBody не является допустимым выражением для любого поставщика.

Вместо этого вам нужно построить Expression<Func<Patient, bool>> выражения и передать его Where методу, как это:

// ... 
var predicate = Expression.Lambda<Func<Patient, bool>>(predicateBody, pe); 
query = query.Where(predicate); 

насчет вашего второго вопроса, то вам нужно использовать некоторые из Expression.Call перегрузок. Например:

Expression predicateBody = Expression.Call(left, "Contains", null, right); 

Похожие на "StartsWith" и "ENDWITH" и т.д.

+0

спасибо, это прекрасно работает. Еще один вопрос: могу ли я использовать сравнение «Equal», «GreaterThan» в методе «Expression.Call()»? – Rahul

+0

№ 'Call' для методов. Но, конечно, вы можете использовать 'Equal',' GreaterThan' и т. Д. В аргументах метода (для условий). У вас есть конкретный пример? –

+0

Могу ли я заменить код 'Expression.NotEqual (слева, справа)' на что-то вроде 'Expression.Call (left," NotEqual ", null, right)'? – Rahul

Смежные вопросы