2013-05-08 11 views
5

フィルタ式をODataQueryOptionsから抽出して、ビジネスロジッククラスで使用できるようにしようとしています。ODataフィルタをLINQ式に変換する方法は?

public PageResult<Poco> Get(ODataQueryOptions odataQueryOptions) 
{ 
    Expression<Func<Poco, bool>> myExpression = ... // what do i do here? 

    var result = _myBusinessLogic.Search(myExpression); 
    return new PageResult<Poco>(result, null, null); 
} 

私はHQL hereにクエリを翻訳記述のブログを見ていたし、私は(少なくとも私は願って)それは私が何をしようとしているためにやり過ぎだと思います。

私は基本的にフィルタ式をExpression<Func<Poco, bool>>形式で取得する必要があります。 ApplyTo()で試してみましたが、それほど得られません。どんな助けもありがたい。

答えて

4

私たちはあなたのニーズに合ったFilterBinderクラスを持っていますが、残念ながら内部的です。それでもあなたは、$のフィルタ式を手に入れるために、あなたのケースで

public static class ODataQueryOptionsExtensions 
{ 
    public static Expression ToExpression<TElement>(this FilterQueryOption filter) 
    { 
     IQueryable queryable = Enumerable.Empty<TElement>().AsQueryable(); 
     queryable = filter.ApplyTo(queryable, new ODataQuerySettings()); 
     return queryable.Expression; 
    } 
} 

を簡単なトリックを行うことができ、あなただけ行うことができ、式はもっとこのように見えるが含まれていることを

public PageResult<Poco> Get(ODataQueryOptions odataQueryOptions) 
{ 
    Expression<Func<Poco, bool>> myExpression = odataQueryOptions.Filter.ToExpression<Poco>(); 

    var result = _myBusinessLogic.Search(myExpression); 
    return new PageResult<Poco>(result, null, null); 
} 

はお知らせ、 SOTests.Customer[].Where($it => conditional-expression)。だから、あなたはラムダからその条件式を抽出しなければならないかもしれません。

+1

ありがとう、私は似たようなことをやった。 MethodCallExpressionへのキャスト、引数やオペランドの抽出など、フィルタの式をApplyToの結果から外すために必要な外科手術がかなりあるようです。このコードの長期的な安定性はやや心配です。 – boris

+0

私はアプリケーション層(api)にコンテキストを公開していないので、ODataQueryOptionsと関連するクラスを利用して、自分のデータレイヤーにフィルタ、ページネーション、ナビゲーションなどを適用したいと考えています。 理想的には、問い合わせ可能なものに適用できるすべての式を抽出し、それらをパラメータとしてアプリケーションの下位レイヤに渡すことができるようにしたいと考えています。 これまでのオプションはODataQueryOptionsを渡すことですが、これは私のビジネスとデータレイヤーをデータに結合することになります。 GitHubで私を助けてくれるかもしれない例がありますか? – Manuel

関連する問題