2013-08-16 5 views
5

मैं एएसपी.नेट एमवीसी 4 और इकाई फ्रेमवर्क 6 (कोड सबसे पहले) और कुछ अजीब व्यवहार है जो मैं नहीं चाहता/पसंद करता हूं:
मेरे पास एक इकाई वर्ग Images है जिसमें एक बूलियन प्रॉपर्टी IsDeleted है और अब मैं पहली 25 छवियां प्राप्त करना चाहता हूं, जिन्हें हटाया नहीं गया है, इसलिए मैंने निम्नलिखित का उपयोग किया कोड:। जहां (i =>! I.IsDeleted) SQL में अनुवाद नहीं करता है लेकिन .Where (i => i.IsDeleted.Equals (false))

IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25); 

इस रूप में बहुत धीमी गति से मैं एक छोटे से गहरी जांच की थी और पता चला, कि Where(i => !i.IsDeleted) पहले से ही डीबी क्वेरी से चलाता है और सभी छवियों को लोड किए गए हैं (और पार्स => धीमी गति से) और चेक तो में "होता है कोड "। मैंने फिर Where(i => i.IsDeleted.Equals(false)) की कोशिश की जो ठीक काम करता था और चेक एसक्यूएल के माध्यम से खुशी करता था।

ऐसा क्यों है कि मैं इस समस्या से कैसे बच सकता हूं, क्योंकि मुझे पहला वाक्यविन्यास बहुत बेहतर लगता है?
क्या यह शायद एक बग uf ईएफ 6 बीटा है या यह अल ईएफ संस्करणों में होता है?

अद्यतन:
समस्या IEnumerable<Image> के कलाकारों (मैं Where मेरी कोड में एक ही पंक्ति में नहीं किया था, लेकिन इसे यहाँ सादगी के लिए परिवर्तित) है, लेकिन मैं यह भी उपयोग कर रहा हूँ का उपयोग कर एक .OrderBy(...).ThenBy(...) करने के लिए Func<T, TKey> -keys और कहा कि वापसी IOrderedEnumerable और नहीं IOrderedQueryable है ...

अद्यतन 2: Expression<Func<T, TKey>> कुंजियों का उपयोग करके हल ...

+1

एचआरएम। यह उत्सुक है। कहां (i => i.IsDeleted == झूठी) के बारे में क्या? – Tim

+0

@Tim: 'i.IsDeleted' के समान', लेकिन मुझे लगता है कि यह 'आईन्यूमेरेबल ' पर मेरा अंतर्निहित कलाकार हो सकता है, न कि 'कहां' (मैंने 'बराबर' 'इनलाइन' किया था, लेकिन '!' " अगली पंक्ति में ") - मैं जांच कर रहा हूं ... – ChrFin

+2

@chrfin ठीक है, तो यहां कारण है। जब आप 'IENumerable आइटम = db.Images;' करते हैं, तो आप डेटाबेस से सभी आइटम स्मृति में प्राप्त करेंगे, 'इसके बजाय' IQueryable' का उपयोग करें, दो पंक्तियों में क्वेरी बनाने के लिए और इसे वास्तव में तब तक निष्पादित न करें जब तक कि आप इसे वास्तव में नहीं चाहते हैं। – MarcinJuraszek

उत्तर

0

टी वह समस्या यह थी कि जैसे ही आप IEnumerable का उपयोग करते हैं, क्वेरी निष्पादित की जाएगी और निम्नलिखित सभी प्रश्न LINQ के रूप में ऑब्जेक्ट क्वेरीज़ के रूप में होंगे।

मेरे गलती जो इस सवाल का है कि मैं प्रश्नों निम्नलिखित तरीके से परीक्षण किया गया था:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false)); 

और

IEnumerable<Image> items = db.Images; 
images = images.Where(i => !i.IsDeleted); 

तो पहले मामले में Where अभी भी एक IQueryable के खिलाफ मार डाला गया था, लेकिन दूसरे मामले में IEnumerable के खिलाफ।

बाद में मैं एक समस्या का सामना करना पड़ा है कि OrderBy के लिए और IQueryable आप Expression<Func<T, K>> मानकों की जरूरत है और मैं Expression<Func<T, IComperable>> करते थे, लेकिन जैसे Func<T, int> को एंटीटी फ्रेमवर्क द्वारा Func<T, IComperable> पर नहीं डाला जा सकता है।
विवरण देखने के लिए इस समस्या को दूर करने के लिए मेरा अन्य प्रश्न देखें HERE

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