問題:SQL ServerデータベースでSQLMetalを使用してDataContextを生成しました。データベースには、Int64識別子を持つエンティティを含むTableAがあります。私のクエリは、いくつかのセットのIDを持つすべての要素を照会するケースを処理する必要があります。データセットが増えたため、このセットには2100を超えるIDが含まれています。LINQ to SQL 2100の最大パラメータ制約の回避箇所
私はこの質問がトピックで尋ねられた他の人に似ていることを認識していますが、私はこの問題を回避するための拡張メソッドを構築するための助けを探しています。
関連した質問:
var ids = new List<long>{ 1, 2, 3, /*...,*/ 2101};
var database = new MyDatabaseClass(connection)
var items = database
.TableA
.Where(x=>ids.Contains(x.RecordID))
.ToList();
そして、このエラーを生成します:
Avoiding the 2100 parameter limit in LINQ to SQL
Hitting the 2100 parameter limit (SQL Server) when using Contains()
私のコードは次のようなものになります
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.
を、私はこの問題Aに実行されている予想されます各種データとしてのロットセットが成長し、任意のテーブルに使用できる汎用拡張を作成したいと考えています。この考え方は、クエリをより小さなWhere Containsクエリに分割し、結果を集約することです。
public static List<TSource> WhereMemberInUniverse<TSource, TUniverse>(this IQueryable<TSource> source, Func<TSource, TUniverse> memberSelector, IEnumerable<TUniverse> universe)
{
var distinctUniverse = universe.Distinct().ToList();
int batchSize = 2000;
var result = new List<TSource>();
for (int i = 0; i < distinctUniverse.Count; i += batchSize)
{
var universeSlice = distinctUniverse.Skip(i).Take(batchSize);
var partialRes = source
.Where(x => universeSlice.Contains(memberSelector(x)));
result.AddRange(partialRes);
}
return result;
}
を呼び出し元のコードがに変更されます:今、これは「universeSlice.Contains」行に失敗している
var ids = new List<long>{ 1, 2, 3, /*...,*/ 2101};
var database = new MyDatabaseClass(connection)
var items = database
.TableA
.WhereMemberInUniverse(x=>x.RecordID, ids);
:
ここで私は考えていますかを示すために私の試みの一つでありますMethod 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.
私が試したすべての試みは、同様のSQL変換エラーで終了するようです。
XMLアプローチを試しましたか? [SQL Server Central](https://www.sqlservercentral.com/Forums/Topic352589-149-1.aspx) –