2013-05-08 13 views
5

Sto cercando di estrarre l'espressione del filtro da ODataQueryOptions in modo da poterlo utilizzare nella mia classe logica aziendale.Come trasformare il filtro OData in un'espressione 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); 
} 

ho preso uno sguardo al blog che descrive tradurre la query in HQL here e penso (almeno spero) che è un peso inutile per quello che sto cercando di fare.

Fondamentalmente ho bisogno di ottenere l'espressione filtro nel modulo Expression<Func<Poco, bool>>. Ho provato a giocare con ApplyTo() ma non riesco a capirlo. Qualsiasi aiuto apprezzato.

risposta

4

Abbiamo una classe FilterBer che si adatta alle tue esigenze ma è sfortunatamente interna. Tuttavia si potrebbe fare un semplice trucco per entrare in possesso del espressione di filtro $,

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

Nel tuo caso, si può solo fare,

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

Si noti che l'espressione contiene assomiglia più a questo, SOTests.Customer[].Where($it => conditional-expression). Quindi, potresti dover estrarre quell'espressione condizionale dal lambda.

+1

Grazie, ho finito per fare qualcosa di simile. Sembra proprio che sia necessario un po 'di chirurgia per ottenere l'espressione del filtro dai risultati di ApplyTo - casting su MethodCallExpression, estrazione di argomenti e operandi, ecc. Leggermente preoccupato per la stabilità a lungo termine di questo codice. – boris

+0

Non sto esponendo il contesto al livello applicazione (api) e vorrei sfruttare ODataQueryOptions e le classi correlate per poter applicare filtri, impaginazione, navigazione e così via, nel mio livello dati. Idealmente, mi piacerebbe essere in grado di estrarre tutte le espressioni che potrei quindi applicare al mio queriesble, passando quelle come parametro ai livelli inferiori dell'applicazione. L'opzione che ho finora è quella di passare ODataQueryOptions, ma questo accoppiare il mio business e il livello dati ai dati, che non voglio. Hai un esempio forse su GitHub che potrebbe aiutarmi? – Manuel

Problemi correlati