1

データベースからデータをフェッチし、linq where 句を使用してデータをフィルタリングする必要があります。私のフィルターは整数列で、1000 を超える値が含まれています。コードで行っているのは、この巨大な配列をそれぞれ 1000 のチャンクに分割し、ベース クエリの where 句に入れることです。

int j = 0;
int batchsize = 1000;
while ((j * batchsize) < items.Count())
{
List<long> batch = items.Skip(j * batchsize)
.Take(batchsize).ToList();
prequery = prequery.Where(x => batch.Contains(x.Id));
j++;
}

SQLで生成されているクエリは以下のとおりです。

SELECT 
    x.name,
    x.email
FROM
    table x
WHERE
    x.Id IN (1,2,3,...,1000) AND
    x.Id IN (1001,1002,1003....,2000)

以下のようにクエリを生成したいのですが、

SELECT 
    x.name,
    x.email
FROM
    table x
WHERE
    x.Id IN (1,2,3,...,1000) OR
    x.Id IN (1001,1002,1003....,2000)

式ツリービルダーを使用してこれを達成し、クエリを動的に生成できますか?もしそうなら、助けてください

4

1 に答える 1

0

「Concat」API を使用できます。

int j = 0;
int batchsize = 1000;


IQueryable<YourType> finalQuery = null;

while ((j * batchsize) < items.Count())
{
   List<long> batch = items.Skip(j * batchsize)
   .Take(batchsize).ToList();

   if (finalQuery == null) {
       finalQuery = prequery.Where(x => batch.Contains(x.Id));
   }
   else
       finalQuery = finalQuery.Concat (prequery.Where(x => batch.Contains(x.Id)));

   j++;
}

これにより、必要なものが論理的に得られます。基本的には、バッチ間で「OR」操作が必要です。Concat は、「UNION ALL」データベース呼び出しに変換されます。

しかし...なぜあなたがこれをしているのか理解できません.すべてのデータを取得しているにもかかわらず、最終的に実行されるステートメントは1つだけになるため、チャンクは役に立ちません.

于 2015-07-16T15:52:03.977 に答える