使用LINQ来提取集合,直到达到聚合条件

时间:2013-06-11 14:28:37

标签: sql linq nhibernate

在高级别,我需要一个可以根据列的总和提取记录子集的查询,就像Linq: How to query items from a collection until the sum reaches a certain value一样。

然而,关键的区别在于他已经在一个物体中得到了他的记录,而我却不能也不能。我的桌子可以有数百万条记录。如果我以他的方式构建我的查询,我会收到此错误:

"A lambda expression with a statement body 
 cannot be converted to an expression tree"

研究之后有意义,LINQ无法将上述问题的答案转化为有效的SQL。

我打算制作一张代表我情况的假设表格。

    Order Id | Cookie Name      | Qty
       1         Sugar             5
       2         Snickerdoodle     4
       3         Chocolate chip    8
       4         Snickerdoodle     10
       5         Snickerdoodle     5

鉴于此示例,我需要编写一个查询来抓取X的{​​{1}}个订单,直到求和的数量超过参数的输入(即如果用户选择13,它将返回记录2& 4)。

我正在使用Nhibernate.Linq,因为我在LINQ中更舒服。如果有需要,我对ICreate完全开放。

作为旁注,我对此感兴趣是一个概念,也是一个直接的问题。即使我需要一个Sum,也必须有一种方法可以做一些类似于执行的事情,直到满足条件为止。

1 个答案:

答案 0 :(得分:1)

务实的方法

int needed = ...;
int actual = 0;
int page = 0;
const int pagesize = 20;   // set to some sensible value, eg. the pagesize of the grid shown to the user
var results = new List<CookieOrder>();

while (actual < needed)
{
    var partialResults = session.Query<CookieOrder>()
        .Where(c => c.Name == "Snickerdoodle")
        .OrderBy(c => c.Id)
        .Skip(page * pagesize)
        .Take(pagesize)
        .ToList();

    for(int i = 0; i < partialResults.Length && actual < needed; i++)
    {
        results.Add(partialResults[i]);
        actual = partialResults[i].Quantity;
    }
    page++;
}

return results;