1

大まかに言えば、列の合計に基づいてレコードのサブセットを取得できるクエリが必要です。Linq: How to query items from a collection until the sum reached 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

このサンプルを考えると、合計 Qty がパラメーターからの入力を超えるまでの最初のX注文を取得するクエリを作成する必要があります (つまり、ユーザーが 13 を選択すると、レコード 2 と 4 が返されます)。Snickerdoodle

私は LINQ の方が快適なので、Nhibernate.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 に答える