2013-05-08 9 views
5

Ich versuche, den Filterausdruck von ODataQueryOptions zu extrahieren, so dass ich es in meiner Business-Logik-Klasse verwenden kann.Wie wird der OData-Filter in einen LINQ-Ausdruck umgewandelt?

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); 
} 

nahm ich einen Blick auf den Blog here die Abfrage in HQL beschreiben übersetzen, und ich denke (hoffe ich zumindest), das ist zuviel des Guten für das, was ich zu tun bin versucht.

Ich muss im Grunde den Filterausdruck in der Expression<Func<Poco, bool>> Form erhalten. Ich habe versucht, mit ApplyTo() zu spielen, aber ich kann es nicht ganz bekommen. Jede Hilfe wird geschätzt.

Antwort

4

Wir haben eine FilterBinder-Klasse, die Ihren Anforderungen entspricht, aber leider intern ist. Dennoch könnte man einen einfachen Trick halten, die $ Filterausdruck zu erhalten,

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; 
    } 
} 

In Ihrem Fall können Sie nur tun,

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); 
} 

Beachten Sie, dass der Ausdruck sieht eher wie dieses enthält, SOTests.Customer[].Where($it => conditional-expression). Also müssen Sie diesen bedingten Ausdruck möglicherweise aus dem Lambda extrahieren.

+1

Danke, ich landete etwas ähnliches. Es sieht so aus, als gäbe es einiges an Operation, um den Filterausdruck aus den Ergebnissen von ApplyTo zu gewinnen - Casting nach MethodCallExpression, Extrahieren von Argumenten und Operanden usw. Etwas besorgt über die Langzeitstabilität dieses Codes. – boris

+0

Ich stelle den Kontext nicht der Anwendungsschicht (API) zur Verfügung, und ich möchte ODataQueryOptions und verwandte Klassen nutzen, um Filter, Seitenumbruch, Navigation usw. in meiner eigenen Datenschicht anwenden zu können. Idealerweise möchte ich alle Ausdrücke extrahieren können, die ich dann auf meine Query anwenden kann, indem ich diese als Parameter an die unteren Ebenen der Anwendung übergebe. Die Option, die ich bisher habe, besteht darin, die ODataQueryOptions zu übergeben, aber dies würde meine Geschäfts- und Datenschicht mit Daten verbinden, die ich nicht möchte. Haben Sie vielleicht ein Beispiel auf GitHub, das mir helfen könnte? – Manuel

Verwandte Themen