为什么是我的ConditionOperator.In的字符串值导致SQL的int值

本文关键字:SQL int 字符串 ConditionOperator In 为什么 我的 | 更新日期: 2023-09-27 17:57:26

我正在使用ConditionOperator编写一个带有Filter的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

为什么是我的ConditionOperator.In的字符串值导致SQL的int值

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

primaryobjecttypecode包含一个表示给定实体类型的数字,即实体类型代码。

1是帐户,2是联系人。

实体类型代码

类型代码低于10000是为Microsoft Dynamics CRM系统保留的实体。自定义实体的值大于或等于10000.请注意,自定义实体对象类型代码可能会在导入和不保证在系统之间是相同的。

可以使用RetrieveAllEntities消息。

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

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

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