जब IQuerayble<TItem>
के साथ काम कर हम Select
इस तरह कॉल कर सकते हैं:अभिव्यक्ति वृक्ष में गतिशील वस्तु को तुरंत चालू और प्रारंभ कैसे करें?
query.Select(item => new { A=item.Prop1, B=item.Prop2});
और Select
विधि उम्मीद Expression<Func<TItem,TResult>>
मैं गुमनाम लेकिन स्थिर टाइप किया वर्ग के बजाय ExpandoObject
उपयोग करने के लिए की जरूरत है।
यदि यह संभव थे यह देखने के लिए की तरह होगा:
query.Select(item => dynamic new ExpandoBoject { A=item.Prop1, B=item.Prop2});
तो मैं अभिव्यक्ति पेड़ Expression<Func<TItem,ExpandoObject>>
जहां ऑब्जेक्ट के गुणों गुमनाम प्रकार के साथ के रूप में समान तरीके से प्रारंभ कर रहे हैं का निर्माण करना चाहते हैं।
डायनामिक कार्यक्षमता केवल प्रारंभिकरण के लिए आवश्यक है, इसलिए यह ठीक है कि Func dynamic
के बजाय ExpandoObject
लौटाता है।
मुझे Expression.Dynamic
और संबंधित बाइंडर्स के बारे में अधिक दस्तावेज नहीं मिल रहा है।
अद्यतन 1
मैं यह सब सामान आवश्यकता क्यों है?
क्योंकि मैं get primary keys चाहता हूं।
मैं इसे किसी भी इकाई प्रकार के लिए करना चाहता हूं।
मुझे पता है कि पीके लिखने वाले गुणों की सूची कैसे प्राप्त करें, लेकिन अब मुझे EntityKey
पर इकाई का एक मुश्किल प्रक्षेपण करने की आवश्यकता है। खैर, इस वर्ग के समान समकक्ष हो सकता है।
var keys = context.Set<TEntity>().Where(Expression<Func<TEntity,bool>).Select(Expression<Func<TEntity,EntityKey>>);
जैसा कि मैंने ब्लॉक युक्त टिप्पणियों lambdas में नोट अभिव्यक्ति पेड़ को नहीं बदला जा सकता तो मैं सरल नहीं शब्दकोश बनाने और इसे भर सकते हैं। अब मैं अभिव्यक्ति पेड़ शब्दार्थ इस कोड के करीब के साथ खेल रहा हूँ:
var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict
लेकिन मुझे शक है एफई ब्लॉक युक्त अभिव्यक्ति पार्स कर सकते हैं। देखने की जरूरत है।
और मैं उत्सुक हूं कि यह गतिशील वस्तुओं और अभिव्यक्ति के साथ काम करेगा। मेम्बरइनिट क्योंकि यह स्थिर वस्तुओं के साथ काम करता है।
अद्यतन 2
इकाई की रूपरेखा शब्दकोश प्रारंभ वाक्य रचना का समर्थन नहीं करता।
यह संदेश के साथ NotSupportedException
फेंकता है: केवल एक तत्व के साथ प्रारंभिक आइटम सूचीबद्ध करें LINQ से इकाइयों में समर्थित हैं।
अद्यतन 3
एफई रूप में अच्छी तरह ब्लॉक भाव समर्थन नहीं करता।
NotSupportedException
संदेश के साथ: टाइप 'ब्लॉक' की अज्ञात LINQ अभिव्यक्ति।
आप ऐसा कुछ नहीं कर सकते: 'query.Select (item => गतिशील नया ExpandoBoject {ए = आइटम.प्रॉप 1, बी = आइटम.प्रॉप 2}); 'लिपर्ट ने इसे बताया: http: // stackoverflow। कॉम/प्रश्न/7478048/क्यों-cant-i-do-this-dynamic-x-new-expandoobject-foo-12-bar-बारह। – xanatos
मुझे पता है, मैं नहीं कर सकता। यह गतिशीलता के साथ अभिव्यक्ति वृक्ष बनाने के इरादे का एक उदाहरण था। –
क्या किया जा सकता है LINQ में एक अनाम प्रकार बनाते हैं और फिर, IQueryable समाप्त होने के बाद, IENumerable भाग में अज्ञात प्रकार को एक Expando ऑब्जेक्ट में कॉपी करें। स्पष्ट रूप से दोनों अभिव्यक्तियों को किसी तरह से स्वत: उत्पन्न किया जा सकता है। – xanatos