動的エンティティ(Microsoft.Xrm.Sdk.Entity、遅延バインディングメソッドなど)を介してCRM2011データを消費するサービスを開発しています。ソリューションを汎用的に保つために、意図的にXrm.csメソッド(初期バインディング)を使用していません。
また、CRMデータベース(EDMXなど)に直接接続することは避けたいと思います。これにより、ホストされたCRMでソリューションを使用できなくなります(DBに直接アクセスできない場合など)。
次の(簡略化された)要件がありますが、選択基準に本当に苦労しています。
レコードのランダムな7%を選択(および更新)する必要があります。
SQLでは、選択基準は比較的簡単です。ランダムな割合のレコードを選択する方法を知っています。何かのようなもの:
SELECT TOP 7 PERCENT * FROM
(
SELECT TOP 1000 NEWID() AS Foo, [someColumns]
FROM [someTable]
)
AS Bar ORDER BY Bar.Foo ASC
これは完全に機能します。LINQに相当するものは次のようなものです。
from e in someEntities
orderby Guid.NewGuid()
select e;
ただし、問題があります。CRM2011動的エンティティでLINQを使用する方法がわかりません。代わりに、このページ(MSDN)に示すように、制限付きのQueryExpressionクラス/構文またはfetchXMLのいずれかを使用する必要があります。
この要件を満たすために、次のオプションを特定しました。
動的エンティティを使用して、レコードセット全体をリストに戻し、インデックスでランダムに選択するだけです。ただし、これにはインターネットデータサービスを介して最大10,000レコードを返すことが含まれ、低速/安全でないなどの可能性があります。
fetchXMLステートメントを使用します。残念ながら、私はfetchXMLを知らないので、COUNT、TOP、PERCENT、NEWID()などを実行できるかどうかわかりません。
Xrm.csとLINQを使用するか、ストアドプロシージャまたはSQLビューを使用します。これらのオプションはすべて、ソリューションをデータベースへの直接接続または早期バインディング、あるいはその両方に結び付けることを意味しますが、これは望ましくありません。
お客様にノーと言ってください。
アドバイスをいただければ幸いです。fetchXMLはこのクエリを実行できますか?これを行うためのより良い方法はありますか?