C# 字典中不存在给定的键-MS CRM FetchXML

C# 字典中不存在给定的键-MS CRM FetchXML,c#,dynamics-crm,crm,fetchxml,C#,Dynamics Crm,Crm,Fetchxml,大量编辑: 似乎是通过把事情简单化来说明问题,我把事情弄得更复杂了 以下是正在运行的全部功能: [AllowAnonymous] [HttpGet] public HttpResponseMessage getCPDActiviesByMemberNumber(int memberNumber) { List<Entity> sourceData = null; List<CPDActivity> membersActivites = new List<CPDAc

大量编辑:

似乎是通过把事情简单化来说明问题,我把事情弄得更复杂了

以下是正在运行的全部功能:

[AllowAnonymous]
[HttpGet]
public HttpResponseMessage getCPDActiviesByMemberNumber(int memberNumber) {

List<Entity> sourceData = null;
List<CPDActivity> membersActivites = new List<CPDActivity>();
List<member> memberRecords = new List<member>();

try {

    string xmlFile = "";
    string memberNumberString = memberNumber.ToString();
    xmlFile = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"_Code\Fetch\MembersActivities.xml");
    xmlFile = String.Format(xmlFile, memberNumberString);
    OrganizationServiceClient crm = new OrganizationServiceClient();
    sourceData = crm.GetEntities(xmlFile);

    if (sourceData.Count > 0) {

        member member = new member();

        foreach (Entity entity in sourceData) {

            CPDActivity cpdActivity = new CPDActivity();

            // sb_membership
            member.ID = entity.GetAttributeValue<Guid>("sb_membershipid");
            member.MemberNumber = entity.GetAttributeValue<String>("sb_membershipno");
            member.ContactID = entity.GetAttributeValue<EntityReference>("sb_contactid").Id.ToString(); ;
            member.MembershipStatus = entity.FormattedValues["statuscode"].ToString();
            member.MemberGrade = entity.GetAttributeValue<String>("sb_name");
            member.StartDate = entity.GetAttributeValue<DateTime>("sb_startdate").ToString();
            member.ExpiryDate = entity.GetAttributeValue<DateTime>("sb_expirydate").ToString();
            // contact (membercontact)
            member.Title = entity.FormattedValues["membercontact.sb_title"].ToString();
            member.FirstName = entity.GetAttributeValue<AliasedValue>("membercontact.firstname").Value.ToString();
            member.LastName = entity.GetAttributeValue<AliasedValue>("membercontact.lastname").Value.ToString();
            member.RegionCode = entity.GetAttributeValue<AliasedValue>("membercontact.sb_regioncode").Value.ToString();
            member.Email = entity.GetAttributeValue<AliasedValue>("membercontact.emailaddress1").Value.ToString();
            // contact (membercontact) - sb_cpdactivity (cpdactivity) 
            member.Region = entity.GetAttributeValue<AliasedValue>("region.sb_name").Value.ToString();
            // sb_cpdactivity (cpdactivity)
            cpdActivity.ActivityName = entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_name").Value.ToString();
            cpdActivity.CreatedOn = (DateTime)entity.GetAttributeValue<AliasedValue>("cpdactivity.createdon").Value;
            cpdActivity.CpdHours = Convert.ToSingle(entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_cpdhours").Value);
            cpdActivity.ActivityDate = (DateTime)entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_activitydate").Value;
            cpdActivity.StatusCode = entity.FormattedValues["cpdactivity.statuscode"].ToString();
            cpdActivity.CpdActivityID = (Guid)entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_cpdactivityid").Value;
            cpdActivity.MemberContactID = ((EntityReference)entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_membercontactid").Value).Id;
            //
            cpdActivity.EventType = entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_type").Value.ToString();  // <<<<< problem here
            cpdActivity.EventType = entity.FormattedValues["cpdactivity.sb_type"].ToString();  // <<<<< problem here
            //
            member.Activities.Add(cpdActivity);
            memberRecords.Add(member);
        }

        return Request.CreateResponse(HttpStatusCode.OK, memberRecords);

    } else {

        return Request.CreateResponse(HttpStatusCode.OK, "getCPDActiviesByMemberId " + "no records found");

    }

} catch (Exception ex) {

    string error = ex.Message.ToString();
    string errors = error;
    return Request.CreateResponse(HttpStatusCode.OK, "getMembers - error : " + error);

}

}
[AllowAnonymous]
[HttpGet]
公共HttpResponseMessage getCPDActiviesByMemberNumber(int memberNumber){
List sourceData=null;
列表成员活动=新建列表();
List memberRecords=新列表();
试一试{
字符串xmlFile=“”;
字符串memberNumberString=memberNumber.ToString();
xmlFile=File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory+@“\u Code\Fetch\MembersActivities.xml”);
xmlFile=String.Format(xmlFile,memberNumberString);
OrganizationServiceClient crm=新的OrganizationServiceClient();
sourceData=crm.GetEntities(xmlFile);
如果(sourceData.Count>0){
成员=新成员();
foreach(sourceData中的实体){
CPDActivity CPDActivity=新的CPDActivity();
//sb_会员资格
member.ID=entity.GetAttributeValue(“sb_membershipid”);
member.MemberNumber=entity.GetAttributeValue(“sb_membershipno”);
member.ContactID=entity.GetAttributeValue(“sb_ContactID”).Id.ToString();
member.MembershipStatus=实体.FormattedValues[“statuscode”].ToString();
member.MemberGrade=entity.GetAttributeValue(“sb_名称”);
member.StartDate=entity.GetAttributeValue(“sb_StartDate”).ToString();
member.ExpiryDate=entity.GetAttributeValue(“sb_ExpiryDate”).ToString();
//联系人(membercontact)
member.Title=entity.FormattedValues[“membercontact.sb_Title”].ToString();
member.FirstName=entity.GetAttributeValue(“membercontact.FirstName”).Value.ToString();
member.LastName=entity.GetAttributeValue(“membercontact.LastName”).Value.ToString();
member.RegionCode=entity.GetAttributeValue(“membercontact.sb_RegionCode”).Value.ToString();
member.Email=entity.GetAttributeValue(“membercontact.emailaddress1”).Value.ToString();
//联系人(membercontact)-sb_cpdactivity(cpdactivity)
member.Region=entity.GetAttributeValue(“Region.sb_name”).Value.ToString();
//sb_cpdactivity(cpdactivity)
cpdActivity.ActivityName=entity.GetAttributeValue(“cpdActivity.sb_name”).Value.ToString();
cpdActivity.CreatedOn=(DateTime)entity.GetAttributeValue(“cpdActivity.CreatedOn”).Value;
cpdActivity.CpdHours=Convert.ToSingle(entity.GetAttributeValue(“cpdActivity.sb_CpdHours”).Value);
cpdActivity.ActivityDate=(DateTime)entity.GetAttributeValue(“cpdActivity.sb_ActivityDate”).Value;
cpdActivity.StatusCode=entity.FormattedValues[“cpdActivity.StatusCode”].ToString();
cpdActivity.CpdActivityID=(Guid)entity.GetAttributeValue(“cpdActivity.sb_CpdActivityID”).Value;
cpdActivity.MemberContactID=((EntityReference)entity.GetAttributeValue(“cpdActivity.sb_MemberContactID”).Value).Id;
//

cpdActivity.EventType=entity.GetAttributeValue(“cpdActivity.sb_type”).Value.ToString();//这是FetchXML查询的预期行为。当您的结果集在所有记录的列(属性)中都有
NULL
值时,该属性将不包括在
EntityCollection
resultset中

如果至少有一条记录具有该列的值,则结果集将包括该列

执行这样的检查并继续

var thing;
if(entity.Contains("sb_eventdateid")){
    thing = entity.GetAttributeValue<Guid>("sb_eventdateid");
}

这是FetchXML查询的预期行为。当您的resultset在所有记录的列(属性)中具有
NULL
值时,该属性将不包括在
EntityCollection
resultset中

如果至少有一条记录具有该列的值,则结果集将包括该列

执行这样的检查并继续

var thing;
if(entity.Contains("sb_eventdateid")){
    thing = entity.GetAttributeValue<Guid>("sb_eventdateid");
}

当您还在fetchxml中包含id属性时会发生什么情况?其他实体也会发生这种情况吗?您使用什么代码来执行fetchxml?如果使用distinct=“true”@user1515791代码编辑会发生什么情况。如果我在fetchxml中包含id,则不会发生任何更改,我仍然只会返回一个属性(sb_cpdactivityid)同样的错误,请您发布一个,清楚地显示异常发生的位置。问题不清楚。我使用的OrganizationServiceProxy实例的retrieveMultipleRequestFetchRequest1=new RetrieveMultipleRequest{Query=new FetchExpression(xml)};EntityCollection returnCollection=((RetrieveMultipleResponse)_service.Execute(fetchRequest1)).EntityCollection;因此,这可能会有所不同。.当您还在fetchxml中包含id属性时会发生什么情况?其他实体也会发生这种情况吗?您使用什么代码来执行fetchxml?如果使用distinct=“true”,会发生什么情况@user1515791代码已编辑。如果在fetchXML中包含id,则不会发生任何更改,我仍然只返回一个属性(sb_cpdactivityid)同样的错误,请您发布一个,清楚地显示异常发生的位置。问题不清楚。我使用的OrganizationServiceProxy实例的retrieveMultipleRequestFetchRequest1=new RetrieveMultipleRequest{Query=new FetchExpression(xml)};EntityCollection returnCollection=((RetrieveMultipleResponse)_service.Execute(fetchRequest1)).EntityCollection;因此,这可能会有所不同。
不需要包含
GetAttributeValue
检查。
GetAttributeValue
将返回
null
默认(类型)
(在本例中为
Guid.Empty
).
GetAttributeValue
我注意到,只有当记录被删除时,才会出现此问题
if(entity.Attributes.Contains("cpdactivity.sb_type") && entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_type") != null)
{
            cpdActivity.EventType = entity.GetAttributeValue<AliasedValue>("cpdactivity.sb_type").Value.ToString();  
            cpdActivity.EventType = entity.FormattedValues["cpdactivity.sb_type"].ToString();
}