2010-06-15 12 views
6

मैं सिर्फ एफई के साथ शुरू हो रही हूँ और निम्नलिखित की तरह एक प्रश्न मुझे अजीब हमलों: "। It.Name"इकाई फ्रेमवर्क क्वेरी बिल्डर विधियों: क्यों "यह" और lambdas नहीं?

var departmentQuery = 
       schoolContext.Departments.Include("Courses"). 
       OrderBy("it.Name"); 

विशेष रूप से, मुझे क्या बाहर चिपक जाता है जब मैं LINQ से SQL के साथ टूलिंग कर रहा था, तो क्वेरी-बिल्डर क्वेरी में बहुत अधिक फ़िल्टर लैम्बडा के साथ निर्दिष्ट किया जा सकता था, जैसे, इस मामले में, d => d.Name।

मुझे लगता है कि ऑर्डरबी के ओवरराइड हैं जो लम्बदास लेते हैं जो IOrderedQueryable या IOrderedEnumable लौटाते हैं, लेकिन जाहिर है कि ऑब्जेक्ट रिसेट प्राप्त करने के लिए निष्पादन विधि की आवश्यकता नहीं है जो तब डेटाबेस हो सकती है।

यह सब मेरे बाद अजीब लगता है कि मैंने इस तरह के सामान के लिए लैम्ब्डा कितना समझ लिया है, और कैसे अभिव्यक्ति के पेड़ों में अनुवाद किया जाता है और फिर एक लक्षित भाषा में - मुझे " it.Name "?

+0

एक और उदाहरण होगा। जहां ("यह। कुछप्रोपर्टी शून्य नहीं है")। अब मुझे देशी सी # में प्रतिनिधित्व किए गए मानक क्वेरी ऑपरेटरों का यह अजीब मिशमाश मिला है जो एक स्पष्ट फ़िल्टर के साथ है जो पूरी तरह से टीएसक्यूएल-भूमि में रहता है। मैंने सोचा कि ईएफ का मुद्दा इससे दूर होना था। – nlawalker

उत्तर

2

मुझे मेरे साथ lamdba अभिव्यक्ति मिलती है; मैं कहां कर सकता हूं (यह। SomProperty == 1) ... क्या आपके पास System.Linq नामस्थान के रूप में है? आप पुनर्गठन की कोशिश कर सकते हैं:

var departmentQuery = विद्यालय में डी से। कॉन्टैक्ट। डिपार्टमेंट्स। शामिल करें ("पाठ्यक्रम") ऑर्डरबी d.Name डी का चयन करें;

ये कुछ संभावनाएं हैं।

एचटीएच।

+0

दिलचस्प। मैं देखता हूं कि आप अभी भी काम कर रहे हैं कि यह अभी भी काम करता है - मुझे बस अपने ग्रिड व्यू के डेटासोर्स को विभागQuery के बजाय विभागQuery में सेट करने की आवश्यकता है। निष्पादन (MergeOptions.Whatever भी), क्योंकि यह अब ऑब्जेक्टQuery के बजाय एक IQueryable या IOrderedQueryable है और इसलिए निष्पादन विधि नहीं है। ऐसा होने पर, ऐसा प्रतीत होता है कि मैं मर्जऑशन सेट करने से चूक रहा हूं। मुझे लगता है कि यह सिर्फ इस मामले में डिफ़ॉल्ट का उपयोग करता है? – nlawalker

+0

अच्छी तरह से IQueryable के साथ भी आप lambdas का उपयोग करने में सक्षम होना चाहिए; जब तक यह सामान्य रूप है, अन्यथा आपको सामान्य प्रकार पर प्राप्त करने के लिए संग्रह पर कास्ट () को कॉल करने की आवश्यकता है। यह LINQ का उपयोग एल 2 ई के बजाय ऑब्जेक्ट्स में कर सकता है। IQueryable इंटरफेस है और ऑब्जेक्टQuery द्वारा भी लागू किया गया है, एफवाईआई। –

+0

मैं जो कह रहा हूं वह यह है कि किसी चीज़ में लैम्ब्डा का उपयोग करना जैसे कि ऑर्डर या ऑर्डर वाई आपको एक IQueryable, * नहीं * ऑब्जेक्टक्वायर देता है। ऑब्जेक्टसेट या ऑब्जेक्टक्वियर पर कहां कॉल करने का प्रयास करें और इंटेलिसेंस के साथ ओवरलोड को देखें - जो अभिव्यक्ति लेते हैं> एक ​​IQueryable लौटाते हैं और जो फनक लेते हैं <> एक आईनेमरेबल लौटाते हैं। ऑब्जेक्टक्वायर वापस पाने का एकमात्र तरीका यह है कि अधिभार को कॉल करना है (स्ट्रिंग, ऑब्जेक्ट पैरामीटर [])। सभी ने कहा कि, अब मैं देख रहा हूं कि आप किसी ऑब्जेक्टक्चर पर वापस जा सकते हैं और निष्पादन() तक पहुंच प्राप्त कर सकते हैं। सहायक चैट, thx के उत्तर के रूप में चिह्नित। – nlawalker

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