2

恥ずかしがり屋のモードを後にして、stackoverflow に最初の投稿をする時が来ました。たくさんの調査 (プラグイン、パフォーマンス、インデックス、更新の種類、友達) を行った後、いくつかのアプローチを試した後、適切な答え/解決策を見つけることができませんでした。

可能であれば、Microsoft Dynamics CRM 2013/2015 プラグインのパフォーマンスの問題 (またはコーディング テクニック) に関するフィードバック/ヘルプを取得したいと思います。

シナリオ:

Microsoft Dynamics CRM 2013/2015
1:N の関係を持つ 2 つのエンティティ
EntityA
EntityB


EntityBには次の列があります。EntityAId | ColumnDemoX (10 進数) | ColumnDemoY (通貨)

エンティティ A のレコード数: 500
エンティティ B のレコード数: エンティティ A のレコードごとに 150 レコード。したがって、500*150 = 75000 レコードです。

目的:

Post Entity A Plugin Update を作成して、次の SQL コマンドを「模倣」します

Update EntityB
Set ColumnDemoX = (some quantity), ColumnDemoY = (some quantity) * (some value)
Where EntityAId = (some id)

1つのアプローチは次のとおりです。

using (var serviceContext = new XrmServiceContext(service)) 
{
  var query = from a in serviceContext.EntityASet
              where a.EntityAId.Equals(someId)
              select a;

  foreach (EntityA entA in query)
  {
    entA.ColumnDemoX = (some quantity);
    serviceContext.UpdateObject(entA);
  }

  serviceContext.SaveChanges();
}

問題:

プラグイン更新後の150 レコードの foreach には20 秒以上かかります。
Update EntityB
Set ColumnDemoX = (いくつかの数量), ColumnDemoY = (いくつかの数量) * (いくつかの値) Where EntityAId = (いくつかの ID) 0.00001
かかります

提案/解決策はありますか?


読んでくれてありがとう。
H

4

3 に答える 3

1

ExecuteMultipleRequestを使用できます。150 個のエンティティを反復処理し、更新する必要があるエンティティを保存してから、リクエストを呼び出します。これを行うと、サービスを 1 回だけ呼び出すだけで、パフォーマンスが向上します。

プロセスがますます大きくなる可能性がある場合は、プラグインまたはカスタム アクティビティ ワークフローとして非同期にすることを検討する必要があります。

これは例です:

// Create an ExecuteMultipleRequest object.
requestWithResults = new ExecuteMultipleRequest()
{
    // Assign settings that define execution behavior: continue on error, return responses. 
    Settings = new ExecuteMultipleSettings()
    {
        ContinueOnError = false,
        ReturnResponses = true
    },
    // Create an empty organization request collection.
    Requests = new OrganizationRequestCollection()
};

// Add a UpdateRequest for each entity to the request collection.
foreach (var entity in input.Entities)
{
    UpdateRequest updateRequest = new UpdateRequest { Target = entity };
    requestWithResults.Requests.Add(updateRequest);
}

// Execute all the requests in the request collection using a single web method call.
ExecuteMultipleResponse responseWithResults =
    (ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);
于 2015-06-04T14:18:03.867 に答える
0

解決策はほとんど思い浮かびませんが、あなたを喜ばせるとは思いません...

  1. これは本当に問題ですか?はい、遅く、データベースの更新ははるかに高速です。ただし、バックグラウンド プロセス (非同期) として使用できる場合は、とにかく番号を取得できます。それは本当に「クリックしたらすぐにこの数字が必要になるか、ビジネスがダウンするか」という状況ですか?

  2. これは、2013 を破棄する理由になる可能性があります。CRM 2015 では、計算フィールドを使用できます。フォームに表示するためだけにこの数値が必要な場合 (たとえば、レポートでは使用しない場合)、javascript で行うこともできます。

  3. これは必死の呼びかけのためのものです。更新を同期的で即時にする必要がある場合、計算フィールドを使用できない場合、自分が何をしているかを本当に知っている場合など...データベースで直接実行しないのはなぜですか? 私はこれが非常に悪いアドバイスであることを知っています. このようにしない理由はたくさんあります (ここでいくつか読むことができます)。これはサポートされておらず、何か間違ったことをすると、非常に悪い結果になる可能性があります。ただし、実際の状況が例のように単純な場合 (計算フィールドのみ、エンティティの作成なし、関係の変更なし)、この方法で実行できます。多くのことを考慮する必要があります。フィールドの監査、セキュリティ、キャッシュの問題、変更者などはありません。実際、私はこの解決策に反対することをお勧めします。

于 2015-06-08T08:06:55.677 に答える