2013-06-11 30 views
1

在高層次上,我需要一個能夠根據列的總和抽取記錄子集的查詢,就像Linq: How to query items from a collection until the sum reaches a certain value一樣。使用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 

鑑於此示例中,我需要編寫抓起Snickerdoodle第一X訂單查詢,直到總結數量從參數exceedes輸入(即如果用戶選擇13,它將返回記錄2 & 4 )。

我使用Nhibernate.Linq,因爲我在LINQ中更加舒適。如果需要,我完全向ICreate開放。

作爲一個便箋,我對這個概念以及直接問題感興趣。即使我需要一個總和,也必須有一種方法來執行類似於執行的操作,直到條件滿足爲止。

+1

我想是因爲他還濾波 「Snickerdoodle」。 – recursive

+2

我會建議編寫sql,而不是找出LINQ表達式。 –

+1

在SQL中表示該查詢可能相當複雜,這意味着它可能甚至更糟(如果可能的話)使用NH執行查詢。傑斯是對的;首先去SQL。你甚至不需要轉換它,NH支持來自SQL的映射實體。 –

回答

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; 
+0

很棒的功能,不幸的是,它不能解決我的問題,它是受害於同一個:規模。做足夠大以確保我符合「需要」參數只會拉太多記錄。 – Seth

+0

我忘了跳過。它應該包括許多小的花費加起來。 – Firo

+0

這在技術上會讓我獲得我想要的數據集,但我肯定會碰到數千次的數據庫。 – Seth

相關問題