मैं एएसपी.नेट एमवीसी 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>>
कुंजियों का उपयोग करके हल ...
एचआरएम। यह उत्सुक है। कहां (i => i.IsDeleted == झूठी) के बारे में क्या? – Tim
@Tim: 'i.IsDeleted' के समान', लेकिन मुझे लगता है कि यह 'आईन्यूमेरेबल' पर मेरा अंतर्निहित कलाकार हो सकता है, न कि 'कहां' (मैंने 'बराबर' 'इनलाइन' किया था, लेकिन '!' " अगली पंक्ति में ") - मैं जांच कर रहा हूं ... –
ChrFin
@chrfin ठीक है, तो यहां कारण है। जब आप 'IENumerable आइटम = db.Images;' करते हैं, तो आप डेटाबेस से सभी आइटम स्मृति में प्राप्त करेंगे, 'इसके बजाय' IQueryable' का उपयोग करें, दो पंक्तियों में क्वेरी बनाने के लिए और इसे वास्तव में तब तक निष्पादित न करें जब तक कि आप इसे वास्तव में नहीं चाहते हैं। –
MarcinJuraszek