2011-02-10 7 views
10

मेरे पास काम की एक इकाई है और ईएफ 4 और पीओसीओ का उपयोग करके एक भंडार है। चूंकि ईएफ को छोड़ने से पहले ऑर्डर किए गए सेट की आवश्यकता होती है() और टेक(), मैंने यह देखने के लिए कि क्या यह काम करता है, रिकॉर्ड को खींचने के लिए मैंने निम्नलिखित यूनिट टेस्ट (मैक्स के बिना) जोड़ा है।मुझे समझने में सहायता करें "LINQ से संस्थाएं केवल कास्टिंग इकाई डेटा मॉडल आदिम प्रकारों का समर्थन करती हैं"

var myList = UOW.EntityRepo.Get(orderbyLambda: p => p.ID, page: 1, pageSize: 1); 

यह परिणाम orderbyLambda = {p => Convert(p.ID)} और गणना के दौरान एक त्रुटि की अभिव्यक्ति में परिणाम देता है। आईडी tinyint (Int16/short)

तो यह आईडी द्वारा आदेश देने में विफल क्यों होता है? त्रुटि

Unable to cast the type 'System.Int16' to type 'System.Object'.

बारे में मैं के रूप में Expression<Func<E, object>> orderbyLambda

संपादित orderbyLambda को परिभाषित:

असली हत्यारा यदि मैं यह कर रहा है:

orderbyLambda: p => new { p.ID } 

यह काम करता है ... क्यूं कर?

उत्तर

15

यह "ऑब्जेक्ट} द्वारा आदेश" और घबराहट कर रहा है; यह जानता है कि string, int, short, DateTime, आदि द्वारा आदेश कैसे करें - लेकिन object थोड़ा अस्पष्ट है।

आपको वास्तविक लैम्ब्डा को सही टाइप करने की आवश्यकता होगी; सरल दृष्टिकोण

.... Get<TIdentity>(
     Expression<Func<E, TIdentity>> orderbyLambda, int page, int pageSize) 

और फिर Get सामान्य बनाने के लिए किया जाएगा, अर्थात्:

orderbyLambda: p => p.ID 

(आप कॉलर पर कोड को बदले बिना) स्वचालित रूप से करना चाहिए कि एक Get<short>(...) सामान्य प्रकार के माध्यम से इस मामले में अनुमान। दूसरा विकल्प इसे <E,object> के रूप में छोड़ना है, लेकिन रिसीवर पर अभिव्यक्ति वृक्ष को फिर से लिखना है। और काम।

+3

ऑर्डरबीलैम्ब्डा: पी => नया {पी.आईडी} काम किया ... बहुत रोचक ... –

+5

मुझे अपनी रिपॉजिटरी एपीआई के ऑर्डरबी भाग बनाने की कोशिश करने में एक ही समस्या थी। LINQ से इकाइयों को ऑर्डरबी (e => e.SomeCollection.Count) पर झुकाया गया। ऑर्डरबी (e => new {e.SomeCollection.Count}) में अभिव्यक्ति को बदलना भी मेरे लिए काम करता है। – danludwig

+0

+1 ऊपर जैतूनहोर की टिप्पणी के लिए, यह मेरे लिए भी काम किया। – Beyers

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