Почему мой ConditionOperator.In со строковыми значениями приводит к SQL со значениями int?

Я пишу 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

В конечном итоге это приводит к исключению SqlException из-за невозможности регистрировать "1" как строку.

Почему строковые значения {"account", "contact"} превращаются в значения {1, 2} int?

Я использую Dynamics CRM 2011 UR 10 на сервере, и мое приложение использует SDK 5.0.9689.2166.


person John M. Wright    schedule 01.02.2013    source источник


Ответы (1)


Поскольку столбец, который вы используете в своем фильтре, имеет тип данных int.

primaryobjecttypecode содержит число, которое представляет данный тип объекта — код типа объекта.

1 аккаунт, 2 контакт.

Коды типов объектов

Коды типов ниже 10 000 зарезервированы для сущностей системы Microsoft Dynamics CRM. Пользовательские объекты имеют значение больше или равное 10 000. Обратите внимание, что коды типов объектов пользовательских сущностей могут измениться во время импорта и не обязательно будут одинаковыми в разных системах.

Вы можете получить коды типов для всех сущностей, используя сообщение RetrieveAllEntities.

Поэтому, если вы собираетесь использовать только системные объекты, вам, вероятно, сойдет с рук:

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

Или, если вы собираетесь использовать настраиваемые сущности, вам придется запросить метаданные CRM или где-то сохранить значения в конфигурации.

person James Wood    schedule 02.02.2013