C# 是否筛选具有类型实体引用的实体?

C# 是否筛选具有类型实体引用的实体?,c#,dynamics-crm,C#,Dynamics Crm,如何使用实体引用对象的字符串值进行查询 QueryExpression query = new QueryExpression("entityName"); query.Criteria = new FilterExpression(); query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%"); 这里的“parentaccountid”基本上是entityreference类型 EntityCo

如何使用实体引用对象的字符串值进行查询

QueryExpression query = new QueryExpression("entityName");
query.Criteria = new FilterExpression();
query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");
这里的“parentaccountid”基本上是entityreference类型

EntityCollection results = crmService.RetrieveMultiple(query);
当我尝试获取结果时,我收到无法强制转换的错误&它需要GUID

query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");
我知道这可能不可能,但我可能还是错了。 是否有其他方法可以使用实体引用对象的字符串进行查询

QueryExpression query = new QueryExpression("entityName");
query.Criteria = new FilterExpression();
query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");
其他信息:

有一个实体“Opportunity”,它有几个名为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);
    }
}
现在,我想使用客户名称进行搜索

但当我添加下面的过滤器时,它会抛出错误,因为它需要GUID

query.Criteria.AddCondition("parentaccountid", ConditionOperator.Like, "14%");
我为客户名称分配了GetAttributeValue(“parentaccountid”).Name。我的搜索参数是name only,因为我在datagridview而不是guid中显示name

但是在QueryExpression中,它要求GUI。我如何做到这一点


您能否通过添加类型为EntityReferences的筛选器来提供我们查询的任何链接?结果是从datagridview绑定的?

虽然我们似乎运气不佳,无法让“like”操作符动态比较字符串和GUID,但至少有两种可能的解决方法:

  • 检索所有GUID,将它们转换为字符串列表,并通过查询该列表(即使用LINQ)找到您的子集
  • 编写一个非常简单的onCreate插件或工作流,将实体上的新文本字段设置为GUID。然后,您就可以将GUID设置为字符串,以供您随意使用
  • 下面是我在工作流程中使用的代码,它与我描述的完全相同(即将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());
        }
    }
    
    公共部分类GetGuid:BaseWorkflow { [输出(“实体Id”)] 公共OutArgument EntityId{get;set;} 受保护的重写void ExecuteInternal(LocalWorkflowContext上下文) { Set(context.CodeActivityContext,context.WorkflowContext.PrimaryEntityId.ToString()); } } 还请注意,虽然“like”运算符不适用于GUID,“大于”和“小于”do,但类似的操作也适用于:

    <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>
    

    虽然让“like”操作符将字符串与GUID进行动态比较似乎运气不佳,但至少有两种可能的解决方法:

  • 检索所有GUID,将它们转换为字符串列表,并通过查询该列表(即使用LINQ)找到您的子集
  • 编写一个非常简单的onCreate插件或工作流,将实体上的新文本字段设置为GUID。然后,您就可以将GUID设置为字符串,以供您随意使用
  • 下面是我在工作流程中使用的代码,它与我描述的完全相同(即将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());
        }
    }
    
    公共部分类GetGuid:BaseWorkflow { [输出(“实体Id”)] 公共OutArgument EntityId{get;set;} 受保护的重写void ExecuteInternal(LocalWorkflowContext上下文) { Set(context.CodeActivityContext,context.WorkflowContext.PrimaryEntityId.ToString()); } } 还请注意,虽然“like”运算符不适用于GUID,“大于”和“小于”do,但类似的操作也适用于:

    <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>
    

    您需要筛选关联的
    账户
    实体的
    名称
    属性

    账户
    实体加入
    商机
    实体,并对其应用
    条件表达式
    ,如下所示:

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

    您需要对关联的
    账户
    实体的
    名称
    属性进行筛选

    账户
    实体加入
    商机
    实体,并对其应用
    条件表达式
    ,如下所示:

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

    parentaccountid是一个

    LinkEntity只能应用于其他实体

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

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

    多亏了Dave,请参见此处,了解parentaccountid是一个

    LinkEntity只能应用于其他实体

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

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

    多亏了Dave,请参见此处了解

    您能否解释在什么情况下需要对Guid密钥的一部分进行过滤?guid本身没有任何意义,应该具有相当随机的值。也许可以用另一种方式满足您的需求?您能解释一下在什么情况下需要对Guid键的某个部分进行过滤吗?guid本身没有任何意义,应该具有相当随机的值。也许你的要求可以通过另一种方式得到满足?谢谢你的解决方案,但是有一点误解。事实上,我的意思是另一个问题。我已经为这个问题添加了额外的细节。谢谢你的解决方案,但是有一点误解。事实上,我的意思是另一个问题。我在问题中添加了额外的细节。这不符合要求,因为属性accountid同时位于account entity和opportunity entity中。opportunity具有属性accountid和parentaccountid。这不符合要求,因为属性accountid同时位于帐户实体和opportunity实体中。opportunity具有accountid和parentaccountid属性。