过滤具有实体参考类型的实体?

时间:2017-07-20 11:04:59

标签: c# dynamics-crm

如何使用字符串值查询实体引用对象?

QueryExpression query = new QueryExpression("entityName");
query.Criteria = new FilterExpression();
query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");

" parentaccountid"这里基本上是类型entityreference。

EntityCollection results = crmService.RetrieveMultiple(query);

当我尝试获得结果时,我收到错误无法投射&它期待着GUID。

我知道这可能是不可能的,但我可能仍然错了。 有没有其他方法可以使用字符串查询实体引用对象?

其他信息:

有一个实体"机会",它有几个属性,名称为name,orderamount,parentaccountid等。

我在应用过滤器后调用服务如下:

QueryExpression query = new QueryExpression("opportunity");
query.Criteria = new FilterExpression();
query.Criteria.AddCondition("name", ConditionOperator.Like, "14%");
FilterExpression childFilter = query.Criteria.AddFilter(LogicalOperator.Or);
childFilter.AddCondition("tmeic_proposalnumber", ConditionOperator.Equal, "XXXXXX");
EntityCollection results = crmService.RetrieveMultiple(query);

我按照以下方式分配结果:

DataTable dt = new DataTable();
dt.Columns.Add("CustomerName");
try
{
    foreach (Entity item in results.Entities)
    {
        DataRow dr = dt.NewRow();
        dr["CustomerName"] = item.Contains("parentaccountid") ? item.GetAttributeValue<EntityReference>("parentaccountid").Name : string.Empty;
        dt.Rows.Add(dr);
    }
}

我将此数据表绑定到windows窗体应用程序中的datagridview:

dgv.DataSource=dt;

现在,我想使用客户名称进行搜索。

但是当我添加过滤器时,它会抛出错误,因为它期待GUID。

query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");

我为客户名称分配了 GetAttributeValue(&#34; parentaccountid&#34;)。姓名。我的搜索参数只是名称,因为我在datagridview中显示名称而不是GUID。

但是在QueryExpression中它要求GUID。我如何实现这一目标?

您可以通过添加类型为EntityReferences&amp;的过滤器来提供我们查询的任何链接吗?结果是从datagridview绑定的吗?

3 个答案:

答案 0 :(得分:3)

您需要过滤关联的name实体的account属性。

account实体加入opportunity实体,然后像这样应用ConditionExpression

var query = new QueryExpression("opportunity");
LinkEntity link = query.AddLink("account", "parentaccountid", "accountid");
link.AddCondition("name", ConditionOperator.BeginsWith, "14");

答案 1 :(得分:2)

虽然看起来我们运气不好让“喜欢”运算符将字符串与动态GUID进行比较,但至少有几种可能的解决方法:

  1. 检索所有GUID,将它们转换为字符串列表,并通过查询该列表(即使用LINQ)查找您的子集。
  2. 编写一个非常简单的onCreate插件或工作流,将实体上的新文本字段设置为GUID。然后你将GUID作为字符串,随意使用。
  3. 这是我在工作流程中使用的代码,它完全符合我的描述(即将GUID填充到文本字段中)。它将输出参数设置为GUID,然后工作流的下一步将该值填充到字段中。

    public partial class GetGuid : BaseWorkflow
    {
        [Output("Entity Id")]
        public OutArgument<string> EntityId { get; set; }
    
        protected override void ExecuteInternal(LocalWorkflowContext context)
        {
            EntityId.Set(context.CodeActivityContext, context.WorkflowContext.PrimaryEntityId.ToString());
        }
    }
    

    请注意,虽然“喜欢”操作符不适用于GUID,“大于”和“小于”操作,所以这样的操作:

    <fetch>
        <entity name="account" >
            <attribute name="accountid" />
            <attribute name="name" />
            <filter type="and" >
                <condition attribute="accountid" operator="gt" value="14000000-0000-0000-0000-000000000000" />
            </filter>
        </entity>
    </fetch>
    

答案 2 :(得分:1)

parentaccountid Lookup Property

LinkEnitity只能应用于其他实体。

过滤的简便方法是在属性末尾添加名称。

query.Criteria.AddCondition("parentaccountidname", ConditionOperator.Like, "%In%");

感谢Dave,请参阅Q&A

相关问题