2012-09-28 26 views
6

मैं विपणन सूचियों की एक सूची ला रहा हूं। जैसा कि मैं ऐसा करता हूं, यह इंटेलिजेंस का उपयोग करके मेरे चेक के अनुसार एक सफल ऑपरेशन प्रतीत होता है। जब मैं ...Entities[0].Attributes["nick"] की तलाश करता हूं तो मुझे एक ऑब्जेक्ट मिलता है (इसमें सही डेटा के साथ)। लेकिन मैं इसे प्रोग्रामेटिक रूप से एक्सेस नहीं कर सकता (इसके बजाय मुझे अच्छी चीजों को फोल्ड करने के लिए प्लस के माध्यम से एक बंदर की तरह चारों ओर क्लिक करना होगा)।सीआरएम गतिशीलता में गुणों के लिए उपनाम का उपयोग करते समय fetchedXML से मूल्यों का उपयोग कैसे करें?

असल में, मुझे नीचे दिए गए कोड का उपयोग करने के लिए संस्थाएं मिल रही हैं। समस्या यह है कि वे कंप्यूटर के अनुसार Strings नहीं हैं। वे Microsoft.Xrm.Sdk.AliasedValue टाइप कर रहे हैं और मुझे नहीं पता कि उनके अंदर वास्तविक निक का उपयोग कैसे किया जाए।

new Contact 
{ 
    Name = element.Attributes["nick"] as String, 
    Mail = element.Attributes["mail"] as String 
} 

Intellisense का कहना है कि Value वहाँ में है (और यह सही मान भी है), लेकिन मैं .Value टाइप करके इसे उपयोग नहीं कर सकते। मुझे संदेह है कि मुझे "जैसा" या ऐसा कुछ उपयोग करने की ज़रूरत है, लेकिन फिलहाल मैं फंस गया हूं। कोई संकेत? As ', String को यह ing, जो काम करने के लिए माना जाता है मुझे null देता है ...

मैं this article और कई अन्य लोगों में यह और जिस तरह से मैं इसे देख की तरह पढ़ा है, मैं सभी उपयोग करने में सक्षम होना चाहिए कर रहा हूँ वहां मजेदार सामान। मैं हालांकि नहीं कर सकता ...

मैंने देखा है कि निम्न कोड मुझे डेटा प्राप्त कर रहा है, मैं इतनी सख्त कोशिश कर रहा हूं लेकिन यह व्यावसायिक वाक्यविन्यास नहीं हो सकता है, है ना? गंभीरता से, ऐसा लगता है एडीएचडी और हैंगओवर के साथ एक हाई स्कूल के छात्र ऐसा करने की कोशिश की ...

new Contact 
{ 
    Name = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["nick"]).Value, 
    Mail = ((Microsoft.Xrm.Sdk.AliasedValue)result.Entities[0].Attributes["mail"]).Value 
} 

मेरा मतलब है, गंभीरता से - इस कोड में से एक बदसूरत टुकड़ा है ... वहाँ एक बेहतर तरीका हो गया है! हालांकि, मुझे डर है क्योंकि this discussion रूप में अच्छी तरह कि सिंटैक्स का उपयोग किए जाने की ...

+0

डाली –

+0

के साथ गलत कुछ भी नहीं है @JamesWood Haha, कहते हैं कि मेरी पूर्व प्रोफेसर करने के लिए कि विश्वविद्यालय में। "अगर आपको कास्ट करने की ज़रूरत है, तो आपको खराब डिजाइन मिल गया है। डू-ओवर!" मुझे लगता है कि मैं सही था कि ** कुछ मामलों में ** कास्टिंग ** ** सही है लेकिन वह शायद इस मामले में माइक्रोसॉफ्ट को दोषी ठहराएगा। यह 90 के दशक में वापस आया जब जावा सुनहरा बच्चा था और जाने का एकमात्र तरीका था। एमएस बुराई और शैतान का एक झुंड था, हाहा। –

+0

ठीक है अगर आप डालना नहीं चाहते हैं तो आप दृढ़ता से टाइप की गई इकाइयों का उपयोग कर सकते हैं। देर से बाध्य इकाई का बिंदु आपको लचीला होने की अनुमति देना है, जो इस मामले में आपको थोड़ी देर में डालना है। इसके अलावा इस मामले में आप ऑब्जेक्ट को बदलने के लिए कास्टिंग नहीं कर रहे हैं (उदाहरण के लिए int से दशमलव), आप कास्टिंग कर रहे हैं ताकि आपके पास सभी गुणों तक पहुंच हो। –

उत्तर

7

documention को देखते हुए लगता है कि नहीं है, Entity वस्तु की Attributes संपत्ति प्रकार AttributeCollection, जो DataCollection<string,Object> से निकला है की है।

संग्रह में प्रत्येक विशेषता के लिए एक कुंजी/मूल्य जोड़ी है।

इसलिए प्रत्येक कुंजी ("निक", "मेल") के लिए, object संबंधित है, जो किसी भी .NET प्रकार का हो सकता है। आप में ऑब्जेक्ट को सही प्रकार (जैसे आपने किया है) को उस गुणों तक पहुंचने के लिए डाला है जो आप ढूंढ रहे हैं (या फिर प्रतिबिंब का उपयोग करें, जो निश्चित रूप से उलझन में होगा, या मुझे लगता है कि सी # 4.0 dynamic type में है, लेकिन उस स्थिति में, आप संकलन-समय की जांच खो देते हैं); संकलक यह निर्धारित करने में सक्षम होगा कि कोई विशेषता string/Money/int/AliasedValue/आदि प्रकार का है या नहीं।

AliasedValue का सवाल है, सीआरएम दिए गए मान बारे में अतिरिक्त जानकारी स्टोर करने के लिए इस प्रकार का उपयोग करता है, और बाद से किसी भी विशेषता aliased हो सकता है, Value संपत्ति किसी भी प्रकार (OptionSetValue, decimal, string, Guid, EntityReference, आदि के हो सकता है ।)। Value संपत्ति उचित रूप से object प्रकार का भी है, इसलिए आपको इसे अपने लौटाए गए मूल्य के बारे में कोई अतिरिक्त जानकारी प्राप्त करने के लिए भी इसे डालना होगा।

तो वहाँ कास्टिंग के आसपास कोई रास्ता नहीं है, लेकिन आप अपने कोड में कम और अपनी फ़ाइल के शीर्ष पर एक using बयान जोड़कर और Contact करने के लिए प्रत्येक AliasedValue पहले काम करने के लिए के मूल्यों को परिभाषित करते हुए शायद क्लीनर बना सकते हैं। भले ही, मैंने प्रत्येक प्रकार के डेटा पुनर्प्राप्ति का एक उदाहरण शामिल किया है; आप तय कर सकते हैं कि आपकी परियोजना में कौन सा बेहतर है।

का प्रयोग कास्टिंग:

using Microsoft.Xrm.Sdk; 

... 

var nick = (AliasedValue)result.Entities[0].Attributes["nick"]; 
var mail = (AliasedValue)result.Entities[0].Attributes["mail"]; 

var contact = new Contact 
{ 
    Name = nick.Value, //Value is of type object; cast again for a more specific type 
    Mail = mail.Value 
}; 

का उपयोग प्रतिबिंब:

var nick = result.Entities[0].Attributes["nick"] 
    .GetType() 
    .GetProperty("Value") 
    .GetValue(result.Entities[0].Attributes["nick"], null); 
var mail = result.Entities[0].Attributes["mail"] 
    .GetType() 
    .GetProperty("Value") 
    .GetValue(result.Entities[0].Attributes["mail"], null); 

var contact = new Contact 
{ 
    Name = nick, 
    Mail = mail 
}; 

गतिशील का उपयोग करना:

dynamic nick = result.Entities[0].Attributes["nick"]; 
dynamic mail = result.Entities[0].Attributes["mail"]; 

var contact = new Contact 
{ 
    Name = nick.Value, //dynamic figures out the right property at runtime 
    Mail = mail.Value 
}; 
+0

ओह, वह अच्छा था। मुझे खुशी नहीं है लेकिन यह अभी भी अच्छा है। एक तरह से मैं संतुष्ट महसूस कर रहा हूं कि ** ** मेरा ** दृष्टिकोण (बदसूरत हो सकता है) दूसरों द्वारा अनुशंसित किया गया था। मैं इसे रखूंगा क्योंकि यह सबसे तेज़ तरीका है। उपरोक्त सभी के लिए +1। आप अधिक पाने के लायक हैं लेकिन एसओ नियम जिस तरह से हैं। 'उपयोग' के लिए, मेरे पास यह है कि मेरे कोड में। यहां मैंने एक बिंदु बनाने के लिए पूरा पथ इस्तेमाल किया। –

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