Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C# 】【Dynamics CRM】事前バインディングのエンティティフィルタリング

前回すべてのエンティティの事前バインディング方法を記載したので、今回は特定のエンティティに絞った事前バインディングの方法を確認しておきたいと思います。

概要

Dynamics CRM SDKで提供されているサンプルコードのCrmSvcUtilExtensionsフォルダのBasicFilteringServiceを利用します。

SDK以下のフォルダパスは以下のとおり。 SDK\SampleCode\CS\CrmSvcUtilExtensions\BasicFilteringService

色々なフィルタリングが可能みたいですが(自分もまだ試していない)、今回は特定エンティティを出力するので BasicFilteringService.csの【ICodeWriterFilterService.GenerateEntity】メソッドを利用します。

実施手順

【ICodeWriterFilterService.GenerateEntity】メソッドによって各エンティティを出力するかどうかの判定が行われ、trueであれば、事前バインディングコードに各エンティティクラスが生成される仕組みのようです。

既定では以下のとおり、EntityMetadataパラメータのIsCutomEntityを確認しており、これによりカスタムエンティティをすべて出力する判定を行っています。

bool ICodeWriterFilterService.GenerateEntity(EntityMetadata entityMetadata, IServiceProvider services) 
{ 
    if (!entityMetadata.IsCustomEntity.GetValueOrDefault()) { return false; } 
    return this.DefaultService.GenerateEntity(entityMetadata, services); 
}

これを特定のエンティティのみ、Trueを返すようにするため、以下のとおりに書き換えます。 今回は【取引先企業:account】と【取引先担当者:contact】を対象に出力するよう書き換えました。

    bool ICodeWriterFilterService.GenerateEntity(EntityMetadata entityMetadata, IServiceProvider services)
    {
        if (entityMetadata.LogicalName == "account" || 
        entityMetadata.LogicalName == "contact") 
    { return true; }
        
    return false;
    }

その後、プロジェクトをビルドしてDebugフォルダに生成された【CrmSvcUtilExtensions.dll】を利用し、CrmSvcUtilを実行します。

今回は先ほどの【BasicFilteringService】を適用するために、コマンド実行時のパラメータに【/codewriterfilter:】を追加します。

パラメータは【"】で囲んだものになり【"クラス名,アセンブリ名"】で記述します。

以下、今回Dynamics CRM Onlineで実行するためのパラメータ例になります。

CrmSvcUtil.exe /codewriterfilter:"BasicFilteringService,CrmSvcUtilExtensions" /url:https://***.api.crm7.dynamics.com/XRMServices/2011/Organization.svc /out:AccountAndContact.cs /username:***@***.onmicrosoft.com /password:*** /namespace:TestName

参考URL

毎度のことながら、Dynamics CRM TeamBlog

blogs.msdn.com

それからMSDN

コード生成ツール用の拡張機能の作成

気分が向いたら、もうちょっと掘り下げようかと思いますが、上記のエンティティ絞込以外あまり利用機会は無いかも……?