Morning Girl

Windows, C#, .NET, Dynamics CRM etc..

【C#】【Dynamics CRM】BlukDeleteJobの作成

Dynamics CRMのデータを一括削除する必要があったので、 その辺りを調べていたのだけど手法としては3つあるかなぁと。

Dynamics CRM における削除手法

  1. 単純にservice.Delete にGuidを渡してあげる
  2. BlukDeleteJobを生成する。
  3. ExecuteMultipleをDeleteに渡してあげる。

【1.】は一番簡単な方法。 一度データを取得してきて、Guidを特定し、For等でひたすら回す。

【2.】はDynamics CRM上からも実行できる一括削除ジョブをプログラムでも作成する手法。 非同期だし、削除するというより削除するジョブを作成するという方が正しいので、かなり利用できるシナリオが制限される気がする。

【3.】は【1.】の応用といった感じ。 プログラムの構造的には複雑になるけれど、パフォーマンスは望める模様。 この辺りは後々掘り下げたいと思う。

とりあえず、【2.】の一括削除ジョブ登録をやってみたので、記しておきたいと思う。

コード

using System;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;

namespace MyProject.CrmBlukDelete
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bluk Delete Start!");

            // Dynamics CRM Onlineに接続 
            var connection = CrmConnection.Parse("Url=https://****.crm7.dynamics.com; Username=****@****.onmicrosoft.com; Password=****;");
            var service = new OrganizationService(connection);

            // 実行するユーザー情報を取得 
            var userRequest = new WhoAmIRequest();
            var userResponse = (WhoAmIResponse)service.Execute(userRequest);
            var currentUserId = userResponse.UserId;
            Console.WriteLine("Get User Infomation : {0}", userResponse.UserId);

            // フィルター条件の指定。今回はとりあえず全件削除するため、作例のみ。
            /*
            var deleteCondition = new ConditionExpression(
                "name", ConditionOperator.Equal, "Fourth Coffee"
                );

            var deleteFilter = new FilterExpression();
            deleteFilter.Conditions.Add(deleteCondition);
            */

            var blukDeleteQuery = new QueryExpression
            {
                EntityName = "account",
                Distinct = false,
                Criteria = new FilterExpression() // or deleteFilter
            };

            var blukDeleteRequest = new BulkDeleteRequest
            {
                JobName = "Sample Bluk Delete",
                QuerySet = new[] { blukDeleteQuery },
                StartDateTime = DateTime.Now,
                ToRecipients = new Guid[] { }, // new[] { currentUserId }
                CCRecipients = new Guid[] { },
                SendEmailNotification = false,
                RecurrencePattern = String.Empty // 定期的に実行するパターンにする場合は"FREQ=DAILY;INTERVAL=1;"などと入力する。
            };

            var blukDeleteResponse =
                (BulkDeleteResponse)service.Execute(blukDeleteRequest);

            Console.WriteLine("Finished Bluk Delete Job : Job No => {0}",blukDeleteResponse.JobId);

            Console.ReadKey();
        }
    }
}

以下の様な感じで一括削除ジョブが登録されます。

f:id:sugimomoto:20150402112745p:plain

■参考URL

サンプル: 共通の条件に合致するレコードを一括して削除する