针对嵌套的OData创建动态linq表达式树

时间:2013-04-24 18:40:36

标签: c# linq dynamic odata expand

我需要为OData Web服务创建动态搜索的动态linq表达式。基本搜索正在运行,但有嵌套表,它不起作用。

格式为webservice / Books('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声明为一个类型的书籍,因此它没有看到嵌套的作者,但我无法弄清楚如何声明它以便它将看到嵌套数据。

确切的错误消息是Instance属性'Author.FirstName'没有为类型'webServices.Books'定义

有谁知道怎么做?它甚至可能吗?感谢任何人都能提供的任何帮助。

我必须做的就是改变这个错误     left = Expression.Property(pe,“Author.FirstName”); 至     表达式属性= Expression.Property(pe,“作者”);     left = Expression.Property(property,“FirstName”);

现在它有效!

谢谢!

1 个答案:

答案 0 :(得分:3)

在这种情况下

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

“Author.FirstName”是属性路径,而不是属性。属性路径通常用于数据绑定,但它们不适用于表达式树 - 您需要更明确。您需要将其更改为此类

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