Where子句使用Expression树构建器

时间:2013-09-21 16:53:38

标签: linq expression-trees

我必须使用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)

我可以使用表达式树构建器实现此操作并动态生成查询,如果是这样,请帮助完成

1 个答案:

答案 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;数据库调用。

但是......我不明白你为什么要这样做,毕竟你抓住了所有的数据,大块没有帮助你,因为最终只会执行一个陈述。