繁体   English   中英

Dynamics CRM 2013 工作流 C# 从链接实体中提取字段

[英]Dynamics CRM 2013 Workflow C# Extract Field from Linked Entity

我正在尝试从 Dynamics CRM 2013 工作流中的相关 CRM 实体获取字段。 下面的代码返回映射的实体,但它没有引用实体中的匹配记录。

如何更新它以便它针对两个匹配的实体 Guid 运行以下查询? 我需要使用 EntityReference 吗?

   QueryExpression FindAddressLots = new QueryExpression(context.PrimaryEntityName);
                    FindAddressLots.LinkEntities.Add
                      (new LinkEntity(context.PrimaryEntityName, "appdetails_data", "applicationdetailsid", "appdetails_dataid", JoinOperator.Inner));
        
             FindAddressLots.LinkEntities[0].Columns.AddColumns("appdetails_dataid", "suburb", "postcode");
    FindAddressLots.LinkEntities[0].EntityAlias = "lotdata";
        
    EntityCollection ec = service.RetrieveMultiple(FindAddressLots);
        
                    foreach (Entity act in ec.Entities)
                    {
        
                      if (act.Attributes.Contains("lotdata.suburb"))
                        {
                          FindAddressLots = act.GetAttributeValue<AliasedValue>("lotdata.suburb").Value.ToString();
                         }
                    }
                }

有什么建议么? 这将不胜感激。 谢谢。

让我们首先澄清一件事:我们不知道suburb的类型,在我的代码中,我假设它是一个字符串,但它可以是其他东西。

查询代码可以改写如下(链接属性、列和别名都一样):

QueryExpression queryAddressLots = new QueryExpression(context.PrimaryEntityName);
LinkEntity linkDetails = queryAddressLots.AddLink("appdetails_data", "applicationdetailsid", "appdetails_dataid", JoinOperator.Inner);
linkDetails.Columns.AddColumns("appdetails_dataid", "suburb", "postcode");
linkDetails.EntityAlias = "lotdata";
EntityCollection collAddressLots = service.RetrieveMultiple(queryAddressLots);

根据代码,没有检索特定记录的逻辑(但通常有),否则这将返回所有与详细信息实体相连的Address Lots (我之前也写过评论,没有人关心真实的实体名称,但他们应该是准确的,当我阅读一个名为applicationdetailsid的字段时,人们可以假设有一个名为applicationdetails的实体并且该实体不存在)

第二部分是如何获取值,可以重写为(同样在这里,变量名,不应使用名为actec的东西):

foreach (Entity addressLot in collAddressLots.Entities)
{
    AliasedValue aliasSuburb = addressLot.GetAttributeValue<AliasedValue>("lotdata.suburb");
    if (aliasSuburb != null && aliasSuburb.Value != null)
    {
        string suburb = (string)aliasSuburb.Value;
    }
}

请注意,我对字符串进行了强制转换,因为正如我在假设该字段是字符串之前所写的那样,如果该字段是整数,我可能会执行类似Convert.ToInt32(aliasSuburb.Value) Whole Number操作

现在,问题提到it isn't referencing the matching record in the entity ,我认为它指的是(正如我之前写的)没有提供 id 并且返回所有记录的事实。 这可以通过在QueryExpression定义之后添加一个条件来轻松解决,例如:

queryAddressLots.Criteria.AddCondition("applicationdetailsid", ConditionOperator.Equal, context.PrimaryEntityId);

当然我们不能保证这是否有效,因为我们不知道字段名称,希望作者知道。 老实说,我们可能只查询这个appdetails_data实体并添加一个条件来匹配applicationdetailsid (对我来说,它看起来像 N:1 关系而不是 1:N 关系)并在不使用LinkEntity的情况下查询suburb字段,但我不能百分百确定。

希望对您有所帮助,下次请不要隐藏实体和字段名称,只需更改前缀即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM