C# 在CRM Dynamics中使用属性别名时,如何从fetchedXML访问值?
我正在拿一份营销清单。当我这样做时,根据我使用intellisense的检查,这似乎是一个成功的操作。当我查找C# 在CRM Dynamics中使用属性别名时,如何从fetchedXML访问值?,c#,dynamics-crm,dynamics-crm-2011,C#,Dynamics Crm,Dynamics Crm 2011,我正在拿一份营销清单。当我这样做时,根据我使用intellisense的检查,这似乎是一个成功的操作。当我查找…实体[0].Attributes[“nick”]时,我得到了一个对象(在其中的某个地方有正确的数据)。但我无法通过编程方式访问它(相反,我必须像猴子一样通过plus点击来折叠好东西) 事实上,我正在使用下面的代码获取实体。问题是,根据计算机的说法,它们不是字符串。它们的类型是Microsoft.Xrm.Sdk.AliasedValue,我不知道如何访问它们内部的实际缺口 新联系人 {
…实体[0].Attributes[“nick”]
时,我得到了一个对象(在其中的某个地方有正确的数据)。但我无法通过编程方式访问它(相反,我必须像猴子一样通过plus点击来折叠好东西)
事实上,我正在使用下面的代码获取实体。问题是,根据计算机的说法,它们不是字符串。它们的类型是Microsoft.Xrm.Sdk.AliasedValue,我不知道如何访问它们内部的实际缺口
新联系人
{
Name=element.Attributes[“nick”]作为字符串,
邮件=元素。属性[“邮件”]为字符串
}
Intellisense说Value
在那里(它也是正确的值),但我无法通过键入.Value
来访问它。我怀疑我需要用“as”之类的词,但现在我被卡住了。有什么提示吗作为
“将其转换为字符串
,它应该可以工作,这会给我空值
我读过书,还有其他几本喜欢它的书,从我的角度来看,我应该能够读到里面所有有趣的东西。但是我不能
我注意到下面的代码让我得到了我拼命想要得到的数据,但是这不可能是一个专业的语法,不是吗?!说真的,看起来像是一个患有多动症和宿醉的高中生试图这么做
新联系人
{
名称=((Microsoft.Xrm.Sdk.AliasedValue)结果。实体[0]。属性[“nick”])。值,
邮件=((Microsoft.Xrm.Sdk.AliasedValue)结果。实体[0]。属性[“邮件])。值
}
我是说,说真的-这是一段丑陋的代码。。。一定有更好的办法!但是,我担心没有,因为似乎也在使用该语法…查看,实体
对象的属性
类型为属性集合
,它派生自数据收集
集合中的每个属性都有一个键/值对
因此,对于每个键(“尼克”、“邮件”),都有一个对应的对象
,可以是任何.NET类型。您必须将对象强制转换为正确的类型(正如您所做的那样)才能访问您正在寻找的属性(或者使用反射,这肯定会更难看,或者我认为在C#4.0中,但在这种情况下,您会丢失编译时检查);否则,编译器将如何确定属性的类型是否为string
/Money
/int
/AliasedValue
/等
至于,CRM使用此类型存储有关返回值的附加信息,并且由于任何属性都可以使用别名,value
属性可以是任何类型(OptionSetValue
,decimal
,string
,Guid
,EntityReference
,等等)。Value
属性也相应地属于object
类型,因此您也必须强制转换该属性,以获取有关返回值的任何其他信息
因此,没有办法进行强制转换,但您可以通过在文件顶部添加语句,并在分配给联系人之前定义每个别名值的值,使代码更短,甚至更干净。无论如何,我已经包含了每种数据检索类型的一个示例;你可以判断哪个项目更好
使用铸造:
使用Microsoft.Xrm.Sdk;
...
var nick=(别名值)结果。实体[0]。属性[“nick”];
var mail=(别名值)结果。实体[0]。属性[“邮件”];
var触点=新触点
{
Name=nick.Value,//值的类型为object;请为更具体的类型再次强制转换
Mail=Mail.Value
};
使用反射:
var nick=result.Entities[0]。属性[“nick”]
.GetType()
.GetProperty(“价值”)
.GetValue(结果.Entities[0]。属性[“nick”],null);
var mail=result.Entities[0]。属性[“邮件”]
.GetType()
.GetProperty(“价值”)
.GetValue(结果.Entities[0]。属性[“邮件”],null);
var触点=新触点
{
姓名=尼克,
邮件
};
使用动态:
dynamic nick=result.Entities[0]。属性[“nick”];
动态邮件=结果。实体[0]。属性[“邮件”];
var触点=新触点
{
Name=nick.Value,//dynamic在运行时计算出正确的属性
Mail=Mail.Value
};
我想你想要这样的东西:
//Get Account PrimaryContact details
public static void GetAccountPrimaryContactDetails(Guid accountId, IOrganizationService orgService)
{
var contactFirstName = default(object);
var contactLastName = default(object);
var contactFullName = default(object);
string fetchXML = string.Format(@"<fetch version='1.0' output-format='xml-platform' no-lock='true' mapping='logical'>
<entity name='account'>
<attribute name='name' />
<filter type='and'>
<condition attribute='statuscode' operator='eq' value='1' />
<condition attribute='accountid' operator='eq' value='{0}' />
</filter>
<link-entity name='contact' from='contactid' to='primarycontactid' alias='ab'>
<attribute name='fullname' alias='as_fullname' />
<attribute name='firstname' alias='as_firstname' />
<attribute name='lastname' alias='as_lastname' />
</link-entity>
</entity>
</fetch>", accountId.ToString());
var fetchExp = new FetchExpression(fetchXML);
EntityCollection accountEntity = orgService.RetrieveMultiple(fetchExp);
if (accountEntity.Entities.Count > 0)
{
//Primary Contact Fullname
AliasedValue avContactFullname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_fullname");
if (avContactFullname != null)
contactFullName = avContactFullname.Value;
//Primary Contact Firstname
AliasedValue avContactFirstname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_firstname");
if (avContactFirstname != null)
contactFirstName = avContactFirstname.Value;
//Primary Contact Lastname
AliasedValue avContactLastname = accountEntity.Entities[0].GetAttributeValue<AliasedValue>("as_lastname");
if (avContactLastname != null)
contactLastName = avContactLastname.Value;
//获取帐户主要联系人详细信息
public static void GetAccountPrimaryContactDetails(Guid accountId、IOR组织服务或服务)
{
var contactFirstName=默认值(对象);
var contactLastName=默认值(对象);
var contactFullName=默认值(对象);
string fetchXML=string.Format(@)
,accountId.ToString());
var fetchExp=新的FetchExpression(fetchXML);
EntityCollection accountEntity=orgService.RetrieveM
public static T GetValue<T>(this Entity entity, string attributeName)
{
if (entity.Attributes.ContainsKey(attributeName))
{
var attr = entity[attributeName];
if (attr is AliasedValue)
{
return GetAliasedValueValue<T>(entity, attributeName);
}
else
{
return entity.GetAttributeValue<T>(attributeName);
}
}
else
{
return default(T);
}
}
private static T GetAliasedValueValue<T>(this Entity entity, string attributeName)
{
var attr = entity.GetAttributeValue<AliasedValue>(attributeName);
if (attr != null)
{
return (T)attr.Value;
}
else
{
return default(T);
}
}
var myValue = myEntity.GetValue<string>("alias.fieldname")