Dynamics CRM 2013 工作流 C# 从链接实体中提取字段
Dynamics CRM 2013 Workflow C# Extract Field from Linked Entity
我正在尝试从 Dynamics CRM 2013 工作流中的相关 CRM 实体获取字段。下面的代码 returns 映射的实体,但它没有引用实体中的匹配记录。
我如何更新它以便它针对两个匹配的实体 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
,在我的代码中我假设它是一个字符串,但它可以是其他东西。
查询代码可以重写如下(link属性、列和别名相同):
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);
根据代码,没有检索特定记录的逻辑(但通常有)否则这将 return 所有 Address Lots
与详细信息实体结合(我还写了一个评论之前,没有人关心真实的实体名称,但它们应该是准确的,当我读到一个名为 applicationdetailsid
的字段时,人们可以假设有一个名为 applicationdetails
的实体,但这个实体不存在)
第二部分是如何获取值,可以重写为(这里也是变量名,不应使用称为 act
或 ec
的东西):
foreach (Entity addressLot in collAddressLots.Entities)
{
AliasedValue aliasSuburb = addressLot.GetAttributeValue<AliasedValue>("lotdata.suburb");
if (aliasSuburb != null && aliasSuburb.Value != null)
{
string suburb = (string)aliasSuburb.Value;
}
}
请注意,我做了一个字符串转换,因为正如我之前写的那样,我假设该字段是一个字符串,如果该字段是 Whole Number
我可能会做类似 Convert.ToInt32(aliasSuburb.Value)
现在,问题提到 it isn't referencing the matching record in the entity
,我假设它指的是(正如我之前写的)没有提供 ID 并且所有记录都是 returned 的事实。这可以通过在 QueryExpression
定义之后添加一个条件来轻松解决,例如:
queryAddressLots.Criteria.AddCondition("applicationdetailsid", ConditionOperator.Equal, context.PrimaryEntityId);
当然我们不能保证这是否有效,因为我们不知道字段名称,希望作者知道。老实说,我们可能只查询这个 appdetails_data
实体并添加一个条件来匹配 applicationdetailsid
(对我来说它看起来像 N:1 关系而不是 1:N 关系) 并在不使用 LinkEntity
的情况下查询 suburb
字段,但我不能 100% 确定。
希望对您有所帮助,下次请不要隐藏实体和字段名称,只需更改前缀即可。
我正在尝试从 Dynamics CRM 2013 工作流中的相关 CRM 实体获取字段。下面的代码 returns 映射的实体,但它没有引用实体中的匹配记录。
我如何更新它以便它针对两个匹配的实体 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
,在我的代码中我假设它是一个字符串,但它可以是其他东西。
查询代码可以重写如下(link属性、列和别名相同):
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);
根据代码,没有检索特定记录的逻辑(但通常有)否则这将 return 所有 Address Lots
与详细信息实体结合(我还写了一个评论之前,没有人关心真实的实体名称,但它们应该是准确的,当我读到一个名为 applicationdetailsid
的字段时,人们可以假设有一个名为 applicationdetails
的实体,但这个实体不存在)
第二部分是如何获取值,可以重写为(这里也是变量名,不应使用称为 act
或 ec
的东西):
foreach (Entity addressLot in collAddressLots.Entities)
{
AliasedValue aliasSuburb = addressLot.GetAttributeValue<AliasedValue>("lotdata.suburb");
if (aliasSuburb != null && aliasSuburb.Value != null)
{
string suburb = (string)aliasSuburb.Value;
}
}
请注意,我做了一个字符串转换,因为正如我之前写的那样,我假设该字段是一个字符串,如果该字段是 Whole Number
我可能会做类似 Convert.ToInt32(aliasSuburb.Value)
现在,问题提到 it isn't referencing the matching record in the entity
,我假设它指的是(正如我之前写的)没有提供 ID 并且所有记录都是 returned 的事实。这可以通过在 QueryExpression
定义之后添加一个条件来轻松解决,例如:
queryAddressLots.Criteria.AddCondition("applicationdetailsid", ConditionOperator.Equal, context.PrimaryEntityId);
当然我们不能保证这是否有效,因为我们不知道字段名称,希望作者知道。老实说,我们可能只查询这个 appdetails_data
实体并添加一个条件来匹配 applicationdetailsid
(对我来说它看起来像 N:1 关系而不是 1:N 关系) 并在不使用 LinkEntity
的情况下查询 suburb
字段,但我不能 100% 确定。
希望对您有所帮助,下次请不要隐藏实体和字段名称,只需更改前缀即可。