我正在學習Linq-to-Sql,我遇到了我試圖建立一個動態查詢與排序,過濾和分頁。根據方法是否鏈接在一起的不同Linq到SQL結果
如果我運行一個查詢這樣我能夠得到「分頁」的結果:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders).Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
在這種情況下,生成的查詢看起來是這樣的:
SELECT <columns>
FROM (
SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
FROM [dbo].[WorkOrders] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
但是,如果我運行像這樣的查詢,它不再被分頁:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
在這種情況下,生成的查詢如下所示:
SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]
我真的不能神交是怎麼回事?這裏究竟什麼時候Sql的Linq生成查詢,並可以添加額外的標準一樣跳過,拿,排序依據,以現有的IQueryable?當我想最終會是這樣的:
IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
query.Where(...);
}
if (search.sortField.Equals("Name")) {
query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();
您是否嘗試過使用SQL Profiler運行的代碼?你能看到SQL實際發送到數據庫的是哪一行嗎?也許這可以幫助回答你的問題。 – 2011-06-08 19:40:18
我使用SQL分析器來檢索上面顯示的生成的查詢;事實證明,問題是我沒有意識到每個Linq方法調用實際上都會返回一個新的IQueryable實例。 – BCG 2011-06-09 11:22:11