पास करने के बारे में उलझन में अभिव्यक्तियों और Funcs कैसे काम करता है के बीच अंतर को समझने में मुझे कुछ परेशानी हो रही है। यह समस्या कर दिया जब किसी से कोई विधि हस्ताक्षर बदल दिया है:अभिव्यक्ति बनाम Func तर्क
public static List<Thing> ThingList(Func<Thing, bool> aWhere)
करने के लिए
public static List<Thing> ThingList(Expression<Func<Thing, bool>> aWhere)
कौन सा मेरी बुला कोड को तोड़ दिया। वर्ष बुला कोड (जो काम किया) इस तरह देखा:
...
object y = new object();
Func<Thing, bool> whereFunc = (p) => p == y;
things = ThingManager.ThingList(whereFunc);
नए कोड (जो काम नहीं करता है) इस तरह दिखता है:
...
object x = new object();
Expression<Func<Thing, bool>> whereExpr = (p) => p == x;
things = ThingManager.ThingList(whereExpr);
यह ThingList अंदर विफल रहता है (...) पर लाइन अभिव्यक्ति का उपयोग:
var query = (from t in context.Things.Where(aWhere)
...
रनटाइम त्रुटि के साथ:
Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
यह उदाहरण दूषित है, लेकिन मेरा अनुमान है कि यह स्थानीय ऑब्जेक्ट वेरिएबल x के साथ कुछ करने के लिए अभिव्यक्ति में ठीक से "प्रतिलिपि" नहीं है।
क्या कोई यह बता सकता है कि सामान्य रूप से इस स्थिति को कैसे संभाला जाए और Func
क्यों काम करता है लेकिन Expression
नहीं है?
हाँ, यह एक इकाई की रूपरेखा के लिए अपनी राह बनाता है। मुझे लगता है कि मुझे अभिव्यक्ति के लिए दो विधियां, एक और फंक के लिए एक जहां आवश्यक हो वहां उपयोग करना होगा। – Erix