6

現在使用されている方法は、DBから読み取られた配列のサイズを確認することです。他の操作が実行されている限り、このようなピギーバックは問題ありません。ただし、既存の連絡先の数を照会するためのより直接的な方法があるかどうかを知りたいです。

私はC#でコーディングしていますが、念のため、JSも知っておく必要があります。

QueryExpression query = new QueryExpression
{
  EntityName = "contact",
  ColumnSet = new ColumnSet(true),
};
EntityCollection response = organizationService.RetrieveMultiple(query);
IEnumerable<Entity> entities = response.Entities;
4

4 に答える 4

12

オプションは次のとおりです。

  1. QueryExpression / LinqをCRMに使用する-これらのメソッドは、サーバー側のカウントをサポートしていません。つまり、これは基本的に現在行っていることであり、すべてのレコードをクライアントに返し、カウントします。これの欠点は次のとおりです。
    1. データベース内の実際の数ではなく、ページサイズを取得します。
    2. ページサイズは5000レコードに制限されているため、すべてのレコードが返されるまで再クエリを続行するには、独自のロジックを実装する必要があります。
    3. 非常に非効率的です。すべてのエンティティからのすべてのデータを返す必要があります。
  2. oData-技術的にはodataを使用できますが、サーバー側のカウントもサポートしていないため、QueryExpressions/Linqとまったく同じ問題が発生します。
  3. Fetch XMLを使用する-これは、CRM内のレコードの集計数を取得するためにサポートされている唯一の方法です。また、必要な情報を返すために必要な最小限の作業を行うという利点もあります。

カウントを取得するために必要なFetchXMLおよびC#コードは次のとおりです。

var xml = @"
<fetch distinct='false' mapping='logical' aggregate='true'> 
    <entity name='contact'> 
       <attribute name='contactid' alias='contact_count' aggregate='count'/> 
    </entity> 
</fetch>";

using (var service = GetOrganizationServiceProxy())
{
  var resultEntity = service.RetrieveMultiple(
  new FetchExpression(xml)).Entities.First();
  var count = resultEntity
    .GetAttributeValue<Microsoft.Xrm.Sdk.AliasedValue>("contact_count").Value;
}

50Kの制限に注意してください!

集約できるエンティティの制限は50,000です。 このSOの質問を参照してください

この制限が低すぎる場合は、SOの質問の提案として実行し、例外をキャッチして50,000を返すことができます。正確な数が必要な場合は、おそらく簡単な方法は、名前を1文字で始まるように制限するフィルターを追加してから、各文字に1つずつ、26の異なるクエリを実行することです。名前が完全に均一に分布していると仮定すると(そうではありません)、最大数は1,300,000になるはずです。


FetchXMLのみがグループ化/集計関数をサポートすることを明示的に述べているMicrosoftサイト-> http://msdn.microsoft.com/en-us/library/gg334607.aspx

CRM / CDSV9+の場合

合計数を取得するための簡単なリクエストがあります:https ://docs.microsoft.com/en-us/dotnet/api/microsoft.crm.sdk.messages.retrievetotalrecordcountrequest?view = dynamics-general-ce-9

于 2013-03-14T12:31:05.607 に答える
4

応答でTotalRecordCountを使用できます。

Console.WriteLine("Total number of records: " + response.TotalRecordCount);
于 2013-03-14T10:00:29.013 に答える
1

カウント集計を使用してFetchXMLを実行できます。

于 2013-03-14T10:38:36.317 に答える
-1

データベースからある種のselectステートメントを実行し、返されたDataTableオブジェクトを調べて、行数を確認していると思います。

やってみてください

SELECT COUNT(*) FROM [TableName] WHERE [condition]

これにより、行数と同じ値になる単一の数値が返されます。

于 2013-03-14T10:02:26.213 に答える