我需要为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”);
现在它有效!
谢谢!
答案 0 :(得分:3)
在这种情况下
left = Expression.Property(pe, "Author.FirstName");
“Author.FirstName”是属性路径,而不是属性。属性路径通常用于数据绑定,但它们不适用于表达式树 - 您需要更明确。您需要将其更改为此类
var author = Expression.Property(pe, "Author");
left = Expression.Property(author, "FirstName");