3

OData Web サービスに対する動的検索用の動的 linq 式を作成する必要があります。基本的な検索は機能していますが、機能しないネストされたテーブルがあります。

形式は webservice/Books('id')/Author です

これを機能させることができます

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 が表示されないためだと思いますが、宣言する方法がわからないため、ネストされたデータが表示されます。

正確なエラー メッセージは、インスタンス プロパティ 'Author.FirstName' がタイプ 'webServices.Books' に対して定義されていません

誰もこれを行う方法を知っていますか? それは可能ですか?誰でもこれで提供できる助けをありがとう。

このエラーを解決するために私がしなければならなかったことは、 left = Expression.Property(pe, "Author.FirstName"); を変更することでした。式プロパティへ = Expression.Property(pe, "作成者"); left = Expression.Property(property, "FirstName");

そして今、それは機能します!

ありがとう!

4

1 に答える 1

3

この場合

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

"Author.FirstName" は、プロパティではなくプロパティパスです。通常、プロパティ パスはデータ バインディングでは機能しますが、式ツリーでは機能しません。より明示的にする必要があります。このようなものに変更する必要があります

var author = Expression.Property(pe, "Author");
left = Expression.Property(author, "FirstName");
于 2013-04-24T19:19:53.090 に答える