如何在CRM Dynamics中使用别名属性时从fetchedXML访问值?

Kon*_*ten 6 c# dynamics-crm dynamics-crm-2011

我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找时,...Entities[0].Attributes["nick"]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折叠好东西).

事实上,我得到的实体应该使用下面的代码.问题是它们不Strings符合计算机.它们属于类型Microsoft.Xrm.Sdk.AliasedValue,我不知道如何访问其中的实际缺口.

new Contact
{
  Name = element.Attributes["nick"] as String,
  Mail = element.Attributes["mail"] as String
}
Run Code Online (Sandbox Code Playgroud)

Intellisense说Value它就在那里(而且它也是正确的值)但是我无法通过输入来访问它.Value.我怀疑我需要使用"as"或类似的东西,但此刻我被卡住了.任何提示?AsString应该起作用,它给了我null......

我已经读过这篇文章以及其他几个喜欢它和我看到它的方式,我应该能够访问那里所有有趣的东西.我不能......

我注意到下面的代码得到我的数据,我这么拼命试图让,但这个不能成为一个专业的语法,可以吗?!说真的,它看起来像一个患有多动症和宿醉的高中生试图这样做......

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

我的意思是,认真 - 这是一段丑陋的代码......必须有一个更好的方法!但是,我担心没有,因为这个讨论似乎也在使用这种语法......

Pet*_*eed 7

查看文档,对象的Attributes属性Entity是类型AttributeCollection,源自DataCollection<string,Object>.

对于集合中的每个属性,都有一个键/值对.

因此,对于每个密钥("nick","mail"),都有一个对应的object,可以是任何.NET类型.你必须将对象强制转换为正确的类型(正如你所做的那样)来访问你正在寻找的属性(或者使用反射,这肯定会更加丑陋,或者我认为在C#4.0中dynamic类型,但是在如果你丢失了编译时检查); 怎么回事就编译器能够确定一个属性是否是类型string/ Money/ int/ AliasedValue/等?

至于AliasedValue中,CRM使用这种类型的存储有关返回的值的附加信息,并且由于任何属性可以是锯齿,该Value属性可以是任何类型(的OptionSetValue,decimal,string,Guid,EntityReference,等等).该Value属性也适用于类型object,因此您必须将其转换为获取有关返回值的任何其他信息.

所以没有办法进行转换,但是你可以通过using在文件顶部添加一个语句并通过AliasedValue在赋值之前定义每个语句的值来缩短代码并使代码更简洁Contact.无论如何,我已经包含了每种数据检索的一个例子; 你可以判断你的项目哪个更好.

使用铸造:

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
};
Run Code Online (Sandbox Code Playgroud)

使用反射:

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
};
Run Code Online (Sandbox Code Playgroud)

使用动态:

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
};
Run Code Online (Sandbox Code Playgroud)