C# Dynamics CRM QueryExpression嵌套链接身份

C# Dynamics CRM QueryExpression嵌套链接身份,c#,dynamics-crm,query-expressions,C#,Dynamics Crm,Query Expressions,我试图从联系人实体中检索数据,将其加入功能实体,然后将功能加入帐户实体 其思想是使用一个查询来检索联系人数据以及其他两个查询中的一些额外字段 我能够通过函数链接实体连接和检索数据,但我在理解如何使用嵌套链接实体时遇到困难 QueryExpression queryExpression = new QueryExpression(Contact.EntityLogicalName); queryExpression.ColumnSet = new ColumnSet(Contact.Fields

我试图从
联系人
实体中检索数据,将其加入
功能
实体,然后将
功能
加入
帐户
实体

其思想是使用一个查询来检索联系人数据以及其他两个查询中的一些额外字段

我能够通过
函数
链接实体连接和检索数据,但我在理解如何使用嵌套链接实体时遇到困难

QueryExpression queryExpression = new QueryExpression(Contact.EntityLogicalName);

queryExpression.ColumnSet = new ColumnSet(Contact.Fields.pix_GZGId, Contact.Fields.Id, Contact.Fields.FirstName, Contact.Fields.LastName, 
    Contact.Fields.MiddleName, Contact.Fields.GenderCode, Contact.Fields.EMailAddress1, Contact.Fields.EMailAddress2, 
    Contact.Fields.Telephone2, Contact.Fields.MobilePhone, Contact.Fields.pix_Gastlessenoptin);
FilterExpression emailFilter = new FilterExpression(LogicalOperator.Or);

emailFilter.AddCondition(Contact.Fields.EMailAddress1, ConditionOperator.Equal, email);
emailFilter.AddCondition(Contact.Fields.EMailAddress2, ConditionOperator.Equal, email);

FilterExpression nameFilterAll = new FilterExpression(LogicalOperator.And);
nameFilterAll.AddCondition(Contact.Fields.FirstName, ConditionOperator.Equal, firstname);
nameFilterAll.AddCondition(Contact.Fields.LastName, ConditionOperator.Equal, lastname);

if (!String.IsNullOrEmpty(middlename))
{
    nameFilterAll.AddCondition(Contact.Fields.MiddleName, ConditionOperator.Equal, middlename);
}

FilterExpression nameFilterPartial = new FilterExpression(LogicalOperator.And);
nameFilterPartial.AddCondition(Contact.Fields.FirstName, ConditionOperator.BeginsWith, firstname.Substring(0,1));
nameFilterPartial.AddCondition(Contact.Fields.LastName, ConditionOperator.Equal, lastname);

FilterExpression nameFilterLast = new FilterExpression();
nameFilterLast.AddCondition(Contact.Fields.LastName, ConditionOperator.Equal, lastname);

FilterExpression completeNameFilter = new FilterExpression(LogicalOperator.Or);
completeNameFilter.Filters.Add(nameFilterAll);
completeNameFilter.Filters.Add(nameFilterPartial);
completeNameFilter.Filters.Add(nameFilterLast);

queryExpression.Criteria = new FilterExpression(LogicalOperator.And);
queryExpression.Criteria.Filters.Add(emailFilter);
queryExpression.Criteria.Filters.Add(completeNameFilter);

queryExpression.AddOrder(Contact.Fields.LastName, OrderType.Descending);

//this is the problem part - it doesn't seem to do anything.
LinkEntity linkedFunctions = new LinkEntity(Contact.EntityLogicalName, pix_functie.EntityLogicalName, 
    Contact.Fields.Id, pix_functie.Fields.pix_Persoon, JoinOperator.LeftOuter);
linkedFunctions.Columns = new ColumnSet(pix_functie.Fields.Id, pix_functie.Fields.pix_Organisatie, 
    pix_functie.Fields.pix_isgzgfunction, pix_functie.Fields.pix_omschrijving, pix_functie.Fields.CreatedOn);
linkedFunctions.EntityAlias = ConfigKeys.PixFunctieAlias;

FilterExpression accountFilterExpression = new FilterExpression();
//accountFilterExpression.Conditions.Add(new ConditionExpression(pix_functie.Fields.pix_isgzgfunction, ConditionOperator.Equal, true));

linkedFunctions.AddLink(Account.EntityLogicalName, pix_functie.Fields.pix_Organisatie, Account.Fields.Id, JoinOperator.LeftOuter);
linkedFunctions.LinkEntities[0].LinkCriteria = accountFilterExpression;
linkedFunctions.LinkEntities[0].EntityAlias = "linkedAccountAlias";

queryExpression.LinkEntities.Add(linkedFunctions);

request.Query = queryExpression;

RetrieveMultipleResponse response = (RetrieveMultipleResponse)_context.Execute(request);
这将从
函数
链接实体中获取数据,然后对其进行分组、排序和处理:

    IEnumerable<Microsoft.Xrm.Sdk.Entity> entities = response.EntityCollection.Entities   
            .OrderByDescending(x => (x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction) != null ? (bool?)
                x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction).Value : new Nullable<bool>()).HasValue)
            .ThenByDescending(x => (x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction) != null ? (bool?)
                x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction).Value : null))
            .ThenByDescending(x => (x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn) != null ? (DateTime?)
                x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn).Value : new Nullable<DateTime>()).HasValue)
            .ThenByDescending(x => (x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn) != null ? (DateTime?)
                x.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn).Value : null));


    List<TtNugGzgDataContract.Entities.Contact> lvl1Contacts = new List<TtNugGzgDataContract.Entities.Contact>();
    List<TtNugGzgDataContract.Entities.Contact> lvl2Contacts = new List<TtNugGzgDataContract.Entities.Contact>();

    foreach(var entity in entities)
    {
        Contact contact = entity.ToEntity<Contact>();
        TtNugGzgDataContract.Entities.Contact contactToAdd = new TtNugGzgDataContract.Entities.Contact()
        {
            externalID = contact.Id,
            firstname = contact.FirstName,
            lastname = contact.LastName,
            insertion = contact.MiddleName,
            gender = Converter.GetApiGender(contact.GenderCodeEnum),
            phone = !String.IsNullOrEmpty(contact.Telephone2) ? contact.Telephone2 : contact.MobilePhone,
            newsletter = contact.pix_GastlessenoptinEnum == pix_nieuwsbriefoptin.Toestaan
        };


        contactToAdd.entityID = entity.GetAttributeValue<AliasedValue>("linkedAccountAlias" + "." + Account.Fields.pix_GZGId) != null ?
            (string)entity.GetAttributeValue<AliasedValue>("linkedAccountAlias" + "." + Account.Fields.pix_GZGId).Value : null;

        contactToAdd.function = entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_omschrijving) != null ?
            (string)entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_omschrijving).Value : null;

        contactToAdd.isGzg = entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction) != null ?
            (bool?)entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_isgzgfunction).Value : null;

        contactToAdd.createdOn = entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn) != null ?
            (DateTime?)entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.CreatedOn).Value : null;

        EntityReference reference = entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_Organisatie) != null ?
            (EntityReference)entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_Organisatie).Value : null;



        contactToAdd.accId = (entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_Organisatie) != null ?
            (EntityReference)entity.GetAttributeValue<AliasedValue>(ConfigKeys.PixFunctieAlias + "." + pix_functie.Fields.pix_Organisatie).Value : new EntityReference()).Id;


        if (!String.IsNullOrEmpty(contact.EMailAddress1) && contact.EMailAddress1.Equals(email, StringComparison.InvariantCultureIgnoreCase))
        {
            contactToAdd.email = contact.EMailAddress1;
            contactToAdd.isSecondaryEmail = false;
            lvl1Contacts.Add(contactToAdd);
        } else
        {
            contactToAdd.email = contact.EMailAddress2;
            contactToAdd.isSecondaryEmail = true;
            lvl2Contacts.Add(contactToAdd);
        }
    }
IEnumerable entities=response.EntityCollection.entities
.OrderByDescending(x=>(x.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix\u functie.Fields.pix\u isgzgfunction)!=null?(bool?)
x、 GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_isgzgfunction).Value:new Nullable()).HasValue)
。然后按降序(x=>(x.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_isgzgfunction)!=null?(bool?)
x、 GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_isgzgfunction).值:null)
.ThenByDescending(x=>(x.GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.CreatedOn)!=null?(日期时间?)
x、 GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.CreatedOn)。值:new Nullable()).HasValue)
.ThenByDescending(x=>(x.GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.CreatedOn)!=null?(日期时间?)
x、 GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.CreatedOn)。值:null);
List lvl1联系人=新列表();
List lvl2Contacts=新列表();
foreach(实体中的var实体)
{
联系人=entity.ToEntity();
TtNugGzgDataContract.Entities.Contact contactToAdd=新建TtNugGzgDataContract.Entities.Contact()
{
externalID=contact.Id,
firstname=contact.firstname,
lastname=contact.lastname,
插入=contact.MiddleName,
gender=Converter.GetApiGender(contact.GenderCodeEnum),
phone=!String.IsNullOrEmpty(contact.Telephone2)?contact.Telephone2:contact.MobilePhone,
时事通讯=contact.pix_gastlesseptinenum==pix_nieuwsbriefoptin.toestan
};
contactToAdd.entityID=entity.GetAttributeValue(“linkedAccountAlias”+“+Account.Fields.pix\u GZGId)!=null?
(string)entity.GetAttributeValue(“linkedAccountAlias”+”+Account.Fields.pix_GZGId)。值:null;
contactToAdd.function=entity.GetAttributeValue(ConfigKeys.PixFunctieA别名+““+pix_functie.Fields.pix_omschrijving)!=null?
(字符串)entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_omschrijving)。值:null;
contactToAdd.isGzg=entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.pix_isgzgfunction)!=null?
(bool?)entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_isgzgfunction)。值:null;
contactToAdd.createdOn=entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.createdOn)!=null?
(DateTime?)entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.CreatedOn)。值:null;
EntityReference引用=entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_organizatie)!=null?
(EntityReference)entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_Organizatie)。值:null;
contactToAdd.accId=(entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+“+pix_functie.Fields.pix_Organizatie)!=null?
(EntityReference)entity.GetAttributeValue(ConfigKeys.PixFunctieAlias+““+pix_functie.Fields.pix_Organizatie)。值:new EntityReference()).Id;
如果(!String.IsNullOrEmpty(contact.EMailAddress1)和&contact.EMailAddress1.Equals(email、StringComparison.InvariantCultureInoRecase))
{
contactToAdd.email=contact.EMailAddress1;
contactToAdd.isSecondaryEmail=false;
LVL1联系人。添加(联系人添加);
}否则
{
contactToAdd.email=contact.EMailAddress2;
contactToAdd.isSecondaryEmail=true;
lvl2Contacts.Add(contactToAdd);
}
}
但是我无法从嵌套链接实体中获取
entityID
。 若别名是正确的,我甚至尝试用第一级链接实体的别名在它前面加上前缀,但并没有效果


有人能给我指出正确的方向吗?

与其手动滚动查询表达式,我建议您使用工具来完成

  • 下载并安装XrmToolBox()
  • 从插件库(在“工具”菜单上)下载FetchXml生成器
  • 在图形界面中使用FetchXml构建查询
  • 在“视图”菜单上,选择“查询表达式”
  • 右侧将弹出一个窗口,显示为FetchXml查询生成的QueryExpression

  • 希望有帮助

    是的,我最后就是这么做的。现在我觉得很尴尬,我几乎整天都在这上面。谢谢你的建议。