オプションは次のとおりです。
- QueryExpression / LinqをCRMに使用する-これらのメソッドは、サーバー側のカウントをサポートしていません。つまり、これは基本的に現在行っていることであり、すべてのレコードをクライアントに返し、カウントします。これの欠点は次のとおりです。
- データベース内の実際の数ではなく、ページサイズを取得します。
- ページサイズは5000レコードに制限されているため、すべてのレコードが返されるまで再クエリを続行するには、独自のロジックを実装する必要があります。
- 非常に非効率的です。すべてのエンティティからのすべてのデータを返す必要があります。
- oData-技術的にはodataを使用できますが、サーバー側のカウントもサポートしていないため、QueryExpressions/Linqとまったく同じ問題が発生します。
- 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