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++;
}

这将在逻辑上为您提供您想要的:基本上您想要批次之间的“或”操作。Concat 被翻译成“UNION ALL”数据库调用。

但是......我不明白你为什么要这样做,毕竟你正在抓取所有数据,块并没有帮助你,因为最终只会执行一个语句。

于 2015-07-16T15:52:03.977 回答