我正在使用QueryExpression运算符和传递字符串作为值使用过滤器编写一个ConditionOperator.In。但是,使用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。
为什么{“帐户”、“联系人”}字符串值变成{1,2} int值?
我在服务器上运行Dynamics 2011 UR 10,我的应用程序使用SDK5.0.968 9.2166
发布于 2013-02-01 16:08:15
因为在筛选器中使用的列是int
数据类型。
primaryobjecttypecode
持有一个表示给定类型实体的数字--实体类型代码。
一是帐户,二是联系。
10,000以下的类型代码保留给Microsoft Dynamics系统实体。自定义实体的值大于或等于10,000。请注意,自定义实体对象类型代码在导入期间可能会更改,并且不能保证系统之间的代码是相同的。 可以使用RetrieveAllEntities消息检索所有实体的类型代码。
因此,如果您只使用系统实体,您可能会逃脱:
filter.AddCondition("primaryobjecttypecode", ConditionOperator.In, 1, 2);
或者,如果要使用自定义实体,则必须查询CRM元数据或将值存储在某个配置中。
https://stackoverflow.com/questions/14656490
复制相似问题