CRM 2011 RC(v5)LINQ-to-CRMプロバイダーを使用してLinqtoCRMクエリを作成しました。CRMエンティティに参加したいローカルで宣言されたList<T>があり、CRMサーバーでクエリを実行したい。例が役立つかもしれません:
MyObject myObject = new MyObject();
List<myAccount> myAccountsList = new List<myAccount>();
myAccountsList.Add(new myAccount() {AccountNumber = "123"};
myAccountsList.Add(new myAccount() {AccountNumber = "456"};
myObject.ListOfAccounts = myAccountsList;
var accountsQuery = from ax in myObject.ListOfAccounts
join a in orgContext.CreateQuery<customAccountEntity>() on ax.AccountNumber equals a.account_number
select a;
foreach(var item in accountsQuery)
{
Console.WriteLine("Id of record retrieved: " + a.Id.ToString());
}
上記のコードはコンパイルおよび実行されますが、レコードのフィルタリングは、CRMエンティティレコードセット全体を取得した後にローカルで実行されます。明らかに、CRMエンティティに数千の行が含まれていると、クエリのパフォーマンスが低下するか、タイムアウトになります。
IQueryableとIEnumerableについて読み、AsQueryable()拡張メソッドを使用してリストを変換しようとしましたが、効果はありませんでした。次のようなSQLを実行するには、上記のLinqクエリが必要です。
SELECT a.*
FROM customAccountEntity AS a
WHERE a.account_number IN ('123', '456');
または、複数のフィールドで結合する場合は、一時テーブルを使用します。どうすればこれを達成できますか?