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

标签 c# dynamics-crm dynamics-crm-2011

我正在获取营销列表列表。当我这样做时,根据我使用智能感知的检查,这似乎是一次成功的操作。当我寻找 ...Entities[0].Attributes["nick"] 时,我得到一个对象(其中某处有正确的数据)。但我无法以编程方式访问它(相反,我必须像猴子一样通过加号四处点击以折叠出好东西)。

事实上,我正在使用下面的代码获取预期的实体。问题是根据计算机,它们不是 Strings。它们属于 Microsoft.Xrm.Sdk.AliasedValue 类型,我不知道如何访问其中的实际昵称。

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

Intellisense 说 Value 在那里(而且它也是正确的值)但我无法通过键入 .Value 来访问它。我怀疑我需要使用“as”或类似的东西,但此刻我被卡住了。有什么提示吗? As'ing 到 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 , Attributes Entity 的属性(property)对象的类型是 AttributeCollection ,源自 DataCollection<string,Object> .

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

因此对于每个键(“nick”、“mail”),都有一个对应的 object ,它可以是任何 .NET 类型。您必须将对象转换为正确的类型(正如您所做的那样)以访问您正在寻找的属性(或者使用反射,这肯定会更丑陋,或者我想在 C# 中4.0 dynamic type ,但在那种情况下,你会失去编译时检查);编译器还能如何确定属性是否属于 string 类型?/Money/int/AliasedValue/等等?

至于 AliasedValue ,CRM 使用此类型存储有关返回值的附加信息,并且由于任何属性都可以使用别名,因此 Value属性可以是任何类型( OptionSetValuedecimalstringGuidEntityReference 等)。 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
};

使用反射:

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
};

关于c# - 在 CRM Dynamics 中使用属性的别名时如何从 fetchedXML 访问值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643418/

相关文章:

c# - 提高此 Azure 表行计数查询的性能

javascript - 使用 AES 在 Crypto.js 和 .NET 密码学中进行不同的加密

c# - 通过 Azure 混合连接连接 SQL Server?

javascript - Microsoft Dynamics CRM - 用于检索实体的两个选项集属性的标签的 OData URL 格式是什么?

javascript - 如何隐藏/显示基于其他选项集的选项集 CRM Dynamics

plugins - 如何发布具有多个程序集的 Dynamics CRM4 插件?

javascript - CRM Javascript 自动使用特定字段填充查找值

asp.net-mvc-3 - 如何让 MVC 与 Dynamics CRM 配合使用?

c# - 命名复杂的方法

javascript - 以编程方式在 Dynamics CRM 2011 中注册 OnLoad 处理程序(用于表单)