2013-05-08 10 views
5

İş ifadesi sınıfımda kullanabilmem için filtre ifadesini ODataQueryOptions'dan ayıklamaya çalışıyorum. o benim yapmak istediğim şey için bir overkill OData filtresi LINQ ifadesine nasıl dönüştürülür?

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

ben HQL here içine sorgu çeviri açıklayan blogunuza göz aldı ve ben (en azından umarım) düşünüyorum.

Temel olarak filtre ifadesini Expression<Func<Poco, bool>> biçiminde almam gerekir. ApplyTo() ile oynamayı denedim ama tam anlamıyla alamıyorum. Herhangi bir yardım takdir edildi.

cevap

4

İhtiyaçlarınıza uygun, ancak maalesef dahili bir FilterBinder sınıfımız var. Yine size durumda $ filtre ifadesi tutmak için basit bir hile,

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

yapabileceğini, sadece ifade daha, böyle görünüyor içeren

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

Bildirim yani yapabiliriz SOTests.Customer[].Where($it => conditional-expression). Yani, bu şartlı ifadeyi lambdadan çıkarmanız gerekebilir.

+1

Teşekkürler, benzer bir şey yaptıklarını bitirdim. Görünüşe göre, Filter ifadesini MethodToMextExpression'a getirme, argümanları ve işlenenleri çıkarma, vb. Sonuçlarından filtre ifadesini elde etmek için birazcık cerrahi gerekiyor. Bu kodun uzun süreli istikrarından biraz endişe duyuyoruz. – boris

+0

Bağlamı uygulama katmanına (api) göstermiyorum ve kendi veri katmanımda filtreler, sayfalama, gezinme ve benzeri işlemleri uygulayabilmek için ODataQueryOptions ve ilgili sınıflardan yararlanmak istiyorum. İdeal olarak, daha sonra uygulayabildiğim tüm ifadeleri çıktısını alıp, uygulamanın alt katmanlarına aşağı doğru parametre olarak geçirmeyi istiyorum. Şimdiye kadar sahip olduğum seçenek ODataQueryOptions'ı geçmek, ancak bu benim iş ve veri katmanımı istemediğim verilere eşler. GitHub'da bana yardımcı olabilecek bir örneğiniz var mı? – Manuel