1

我正在使用 ConditionOperator.In 运算符编写带有过滤器的 QueryExpression,并将字符串作为值传递。但是,使用 CRM 服务器上的跟踪,我可以查看生成的 SQL,并且它正在用“1、2、3”替换我的字符串。

具体来说,这段代码:

var filter = new FilterExpression(LogicalOperator.And);
filter.AddCondition("primaryobjecttypecode", ConditionOperator.In, "account", "contact");

var query = new QueryExpression("sdkmessagefilter")
{
    ColumnSet = new ColumnSet("primaryobjecttypecode"),
    Criteria = filter,
    LinkEntities =
        {
            new LinkEntity()
            {
                 LinkFromEntityName = "sdkmessagefilter",
                 LinkFromAttributeName =  "sdkmessageid",
                 LinkToEntityName = "sdkmessage",
                 LinkToAttributeName = "sdkmessageid",
                 Columns = new ColumnSet("name"),                              
             },                                                       
         }
 };

 var response = orgProxy.RetrieveMultiple(query);

此 SQL 的结果:

select top 5001 
    "sdkmessagefilter0".PrimaryObjectTypeCode as "primaryobjecttypecode",
    "sdkmessage1".Name as "sdkmessage1.name" 
from
    SdkMessageFilter as "sdkmessagefilter0" 
    join SdkMessage as "sdkmessage1" 
       on ("sdkmessagefilter0".SdkMessageId  =      "sdkmessage1".SdkMessageId) 
where
    ((("sdkmessagefilter0".PrimaryObjectTypeCode in (1, 2)))) 
order by "sdkmessagefilter0".SdkMessageFilterId asc

最终,由于未能将“1”作为字符串大小写,这会导致 SqlException。

为什么 {"account", "contact"} 字符串值会变成 {1, 2} int 值?

我在服务器上运行 Dynamics CRM 2011 UR 10,我的应用程序正在使用 SDK 5.0.9689.2166

4

1 回答 1

3

因为您在过滤器中使用的列是一种int数据类型。

primaryobjecttypecode持有一个代表给定实体类型的数字——实体类型代码。

1是账号,2是联系方式。

实体类型代码

低于 10,000 的类型代码保留给 Microsoft Dynamics CRM 系统实体。自定义实体的值大于或等于 10,000。请注意,自定义实体对象类型代码在导入期间可能会发生变化,并且不保证在系统之间相同。

您可以使用 RetrieveAllEntities 消息检索所有实体的类型代码。

因此,如果您只打算使用系统实体,您可能会逃脱:

filter.AddCondition("primaryobjecttypecode", ConditionOperator.In, 1, 2);

或者,如果您要使用自定义实体,则必须查询 CRM 元数据或将值存储在配置中的某处。

于 2013-02-02T00:08:15.073 回答