加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:21:40 所属栏目:百科 来源:网络整理
导读:我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找…实体[0] .Attributes [“nick”]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折
我正在提取营销列表清单.正如我这样做,根据我使用intellisense的检查,这似乎是一次成功的操作.当我寻找…实体[0] .Attributes [“nick”]我得到一个对象(在其中的某个地方有正确的数据).但是我不能以编程方式访问它(相反,我必须像猴子一样点击,通过优点来折叠好东西).

事实上,我得到的实体应该使用下面的代码.问题是根据计算机它们不是字符串.它们是Microsoft.Xrm.Sdk.AliasedValue类型,我不知道如何访问它们内部的实际缺口.

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

Intellisense说Value在那里(并且它也是正确的值)但我无法通过输入.Value来访问它.我怀疑我需要使用“as”或类似的东西,但此刻我被卡住了.任何提示?作为String,它应该工作,给我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似乎也在使用该语法……

解决方法

查看 documention,Entity对象的Attributes属性属于AttributeCollection类型,它派生自DataCollection< string,Object>.

For each attribute in the collection there is a key/value pair.

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

对于AliasedValue,CRM使用此类型存储有关返回值的其他信息,并且由于任何属性都可以别名,因此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
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读