Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CRM Dynamics中使用属性别名时,如何从fetchedXML访问值?_C#_Dynamics Crm_Dynamics Crm 2011 - Fatal编程技术网

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

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,我不知道如何访问它们内部的实际缺口 新联系人 {

我正在拿一份营销清单。当我这样做时,根据我使用intellisense的检查,这似乎是一个成功的操作。当我查找
…实体[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")