2011-12-28 121 views
3

我有Linq查詢並希望立即執行它,然後處理數據。現在在下面的代碼中,執行第二個(2)Linq查詢時,將執行第一個(1)Linq查詢。我想先執行第一個(1)查詢,該怎麼做?Linq to SQL立即執行查詢

// 1 
var statistic = DataAccess.Instance.Statistics 
        .Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId) 
        .Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day }); 


values = new int[interval]; 
labels = new string[interval]; 

for (var i = 0; i < labels.Length; i++) 
{ 
    // 2 
    var recordsCount = statistic.Count(p => p.Year == dayStep.Year && p.Month == dayStep.Month && p.Day == dayStep.Day); 
} 

回答

8

我認爲你缺少數據操作的一個重要概念,在.NET

遞延和直接載入

強調的重要一點是,默認情況下,LINQ to SQL的檢索來自數據 數據庫僅在您請求時才提供,而不在您定義LINQ to SQL查詢時創建,或者創建 表集合。這被稱爲延遲提取。

當foreach循環啓動時,LINQ to SQL創建並運行從LINQ to SQL查詢派生的SQL SELECT語句 以創建ADO.NET DataReader對象。 foreach循環的每次迭代執行必要的GetXXX方法來獲取該行的數據。在 之後,最後一行已被foreach循環取回並處理完畢,LINQ to SQL關閉了數據庫連接 。

延遲提取確保只有應用程序實際使用的數據從 數據庫中檢索。但是,如果您正在訪問運行在SQL 服務器的遠程實例上的數據庫,則逐行提取數據不會充分利用網絡帶寬。在此 方案中,您可以通過強制立即對LINQ to SQL查詢執行 評估來獲取並緩存單個網絡請求中的所有數據。

var productsQuery = from p in products.ToList() 
select p; 
+0

我不會錯過任何東西:當你定義的LINQ to SQL查詢 ,這樣你可以通過調用ToList或ToArray的 擴展方法,其獲取數據到一個列表或數組做到這一點。我問如何執行數據,然後執行額外的操作,因爲我瞭解Linq如何工作:)無論如何謝謝你的詳細描述! – Tomas 2011-12-28 13:42:35

+0

:-) ....只是添加.ToList()或ToArray(),你很好 – 2011-12-28 13:44:17

+0

@PankajUpadhyay這是'var productsQuery = =(從產品中的p 選擇p.ToList();'與代碼相同在你的例子中?如果不是,如果我添加一個where子句到你的例子中,它只會提取匹配where子句的結果 – Igor 2014-10-11 17:03:02

3

試試這個第一次聲明(注意.ToList()語句)

var statistic = DataAccess.Instance.Statistics.Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId). 
       Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day }).ToList(); 
1

你可以這樣做.ToList(),它應該強制執行。