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値に変わるのはなぜですか?

サーバーでDynamicsCRM2011 UR 10を実行していて、アプリでSDK5.0.9689.2166を使用しています

4

1 に答える 1

3

フィルタで使用している列はintデータ型であるためです。

primaryobjecttypecode特定のタイプのエンティティ(エンティティタイプコード)を表す番号を保持します。

1はアカウント、2は連絡先です。

エンティティタイプコード

10,000未満のタイプコードは、MicrosoftDynamicsCRMシステムエンティティ用に予約されています。カスタムエンティティの値は10,000以上です。カスタムエンティティオブジェクトタイプコードはインポート中に変更される可能性があり、システム間で同じであるとは限らないことに注意してください。

RetrieveAllEntitiesメッセージを使用して、すべてのエンティティのタイプコードを取得できます。

したがって、システムエンティティのみを使用する場合は、おそらく次のことを回避できます。

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

または、カスタムエンティティを使用する場合は、CRMメタデータをクエリするか、構成のどこかに値を保存する必要があります。

于 2013-02-02T00:08:15.073 に答える