2009-09-25 27 views
0

我看到一個ADO.NET EF和LINQ pagging結構是這樣的:ADO.NET EF和LINQ pagging記錄和轉換爲SQL

var query = ...your normal query here... 
int totalRecordCount = query.Count(); 
var pagedQuery = query.Skip(PageIndex*PageSize).Take(PageSize); 

此代碼似乎所有記錄將它們設置查詢到本地存儲器,所以它得到了總數。之後,它使用跳轉功能將頁面解除記錄到變量pagedQuery中。我錯了嗎? comipile如何將它轉換爲SQL?另一個是做什麼的?

回答

3

如果對象要查詢工具IQueryable<T>將建立取決於您使用的擴展方法不同的查詢。 (如果你正在使用Linq-to-Entities,它必須是這樣)

但是,記錄SQL並不像Linq-to-SQL那麼簡單。

要麼使用一個分析器,或嘗試在項目中添加這種擴展方法的靜態類:

static string ToTraceString<T>(this IQueryable<T> t) 
{ 
    ObjectQuery<T> oqt = t as ObjectQuery<T>; 

    if (oqt != null) 
    return oqt.ToTraceString(); 

    return ""; 
} 

有了它,你應該能夠驗證由不同的數據庫查詢的SQL。

var query = ...your normal query here... 
Console.WriteLine(query.ToTraceString()); 

var pagedQuery = query.Skip(PageIndex*PageSize).Take(PageSize); 
Console.WriteLine(pagedQuery.ToTraceString()); 
// Should return something along the lines of SELECT ... FROM ... SKIP x LIMIT y 
+0

不錯!我使用nHibernate做了類似的事情。非常感謝! – 2009-10-01 04:03:40

+0

VAR countQuery = query.Count()將返回int,它是不是IQueryable的! – Evgenyt 2011-01-28 13:41:36

+0

謝謝,這是我的疏忽。 – 2011-01-28 21:22:02

2

您可以運行的SQL Server Profiler來看看到底是什麼的SQL可以生成...

我相信調用COUNT()做一個SELECT COUNT(*)和跳過()。 Take()做一個SELECT TOP N,所以你實際上並沒有拉回所有的記錄。