我必须使用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)
我可以使用表达式树构建器实现此操作并动态生成查询,如果是这样,请帮助完成
答案 0 :(得分:0)
你可以使用&#34; Concat&#34; 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++;
}
这将从逻辑上得到你想要的东西:基本上你想要一个&#34; OR&#34;批次之间的操作。 Concat被翻译成&#34; UNION ALL&#34;数据库调用。
但是......我不明白你为什么要这样做,毕竟你抓住了所有的数据,大块没有帮助你,因为最终只会执行一个陈述。