1

在高层次上,我需要一个可以根据列的总和拉取记录子集的查询,就像Linq:如何从集合中查询项目直到总和达到某个值一样。

然而,关键的区别在于他已经在一个对象中获得了他的记录,而我没有也不能。我的表可以有数百万条记录。如果我按照他的方式构建查询,我会收到以下错误:

"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订单,Snickerdoodle直到总和 Qty 超过参数的输入(即,如果用户选择 13,它将返回记录 2 和 4 )。

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

作为旁注,我对此既是一个概念又是一个直接问题感兴趣。即使我需要一个 Sum,也必须有一种方法来执行类似于执行直到满足条件的 takewhile 的操作。

4

1 回答 1

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;
于 2013-06-12T12:52:08.283 回答