Создание динамического дерева выражений linq для вложенных OData

Мне нужно создать динамическое выражение linq для динамического поиска в веб-службе OData. Базовый поиск работает, но есть вложенные таблицы, где он не работает.

Формат: веб-сервис/Книги('id')/Автор.

Я могу заставить это работать

var authors = from p in webservice.Books.Expand("Author")                        
where p.Title.Equals("Watership Down") && p.Author.FirstName.Equals("Richard") 
select p;

Я изменил его на следующее:

var authors = webservice.Books.Expand("Author").Where(condition);

и я строю условие следующим образом:

ParameterExpression pe = Expression.Parameter(typeof(webservice.Books), "p");

Expression left = Expression.Property(pe, "Title");
Expression right = Expression.Constant("Watership Down"); 
Expression predicateBody = Expression.Equal(left, right);             

Expression<Func<webservice.Books, bool>> condition = Expression.Lambda
            <Func<webservice.Books, bool>>(predicateBody, new ParameterExpression[] { pe });

Который работает.

Так что, если я попытаюсь

ParameterExpression pe = Expression.Parameter(typeof(webservice.Books), "p");

Expression left = Expression.Property(pe, "Title");
Expression right = Expression.Constant("Watership Down"); 
Expression e = Expression.Equal(left, right);             

left = Expression.Property(pe, "Author.FirstName");
right = Expression.Constant("Richard"); 
Expression e2 = Expression.Equal(left, right);             

Expression predicateBody = Expression.And(e, e2);             

Expression<Func<webservice.Books, bool>> condition = Expression.Lambda
            <Func<webservice.Books, bool>>(predicateBody, new ParameterExpression[] { pe });

Но это не работает. Он не распознает Author.FirstName как свойство. Я думаю, это потому, что я объявляю pe как тип Books, и поэтому он не видит вложенного автора, но я не могу понять, как его объявить, чтобы он видел вложенные данные.

Точное сообщение об ошибке: свойство экземпляра «Author.FirstName» не определено для типа «webServices.Books».

Кто-нибудь знает как это сделать? Это вообще возможно? Спасибо за любую помощь, которую кто-либо может предложить с этим.

Что мне нужно было сделать, чтобы решить эту ошибку, так это изменить left = Expression.Property(pe, "Author.FirstName"); to Expression property = Expression.Property(pe, "Автор"); left = Expression.Property(property, "FirstName");

И теперь это работает!

Спасибо!


person user2316797    schedule 24.04.2013    source источник


Ответы (1)


В таком случае

left = Expression.Property(pe, "Author.FirstName");

"Author.FirstName" — это путь к свойству, а не свойство. Пути свойств обычно работают для привязки данных, но они не будут работать для деревьев выражений — вам нужно быть более явным. Вам нужно будет изменить его на что-то вроде этого

var author = Expression.Property(pe, "Author");
left = Expression.Property(author, "FirstName");
person default.kramer    schedule 24.04.2013