2013-05-08 5 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 में क्वेरी का अनुवाद का वर्णन पर एक नज़र लिया और मुझे लगता है कि (कम से कम मुझे उम्मीद है कि) है कि मैं क्या कर रहा हूँ के लिए एक overkill है।

मुझे मूल रूप से Expression<Func<Poco, bool>> रूप में फ़िल्टर अभिव्यक्ति प्राप्त करने की आवश्यकता है। मैंने ApplyTo() के साथ खेलने की कोशिश की लेकिन मुझे काफी कुछ नहीं मिल रहा है। किसी भी मदद की सराहना की।

उत्तर

4

हमारे पास एक फ़िल्टरबिंडर क्लास है जो आपकी आवश्यकताओं के अनुरूप है लेकिन दुर्भाग्यवश आंतरिक है। फिर भी आप $ फिल्टर अभिव्यक्ति की पकड़ पाने के लिए एक सरल चाल,

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

धन्यवाद, मैं कुछ ऐसा ही कर रहा हूं। ऐसा लगता है कि आवेदन अभिव्यक्ति के परिणाम से फ़िल्टर अभिव्यक्ति को प्राप्त करने के लिए पर्याप्त सर्जरी की आवश्यकता है, विधिकोलएक्सप्रेस को कास्टिंग, तर्क और संचालन निकालने आदि। इस कोड की दीर्घकालिक स्थिरता के बारे में थोड़ा चिंतित है। – boris

+0

मैं एप्लिकेशन लेयर (एपीआई) में संदर्भ का खुलासा नहीं कर रहा हूं, और मैं अपने डेटा लेयर में फ़िल्टर, पेजिनेशन, नेविगेशन आदि को लागू करने में सक्षम होने के लिए ODataQueryOptions और संबंधित कक्षाओं का लाभ उठाना चाहता हूं। आदर्श रूप में, मैं उन सभी अभिव्यक्तियों को निकालने में सक्षम होना चाहता हूं जो मैं कर सकता हूं, फिर मेरे प्रश्नोत्तरी पर लागू हो सकता है, जो आवेदन की निचली परतों पर पैरामीटर के रूप में गुजर रहा है। मेरे पास अब तक का विकल्प ODataQueryOptions को पास करना है, लेकिन यह मेरे व्यापार और डेटा परत को डेटा में जोड़ देगा, जो मैं नहीं चाहता हूं। क्या आपके पास गिटहब पर शायद एक उदाहरण है जो मेरी मदद कर सकता है? – Manuel

संबंधित मुद्दे