2013-01-15 53 views
0

我已經創建了一個DataTable。在完成一些操作後,我填充了DataTable的行。使用Linq從DataTable中選擇帶有記錄的頂部N

我對Linq很新,我想從DataTable獲取頂級的「N」記錄,實現一些分頁。

dataTable是具有一些數據的DataTable。

我需要的是這樣的

var Query = from d in dataTable 
     Order by columnName 
     skip(some records pageSize * pageNumber) 
     Select top N from dataTable 

列名,頁面大小,PAGENUMBER和N將作爲參數傳遞

回答

3

試試這個:

var query = dataTable.AsEnumerable() 
     .OrderBy(c => c.columnName) 
     .Select(r => new {...}) 
     .Skip(10) 
     .Take(5) 
+0

燦我做了一些像(c =>「列名」)。因爲它需要參數化 – user1884709

+0

要參數化LINQ,您需要構建表達式。 –

+0

看看這個鏈接http://ronniediaz.com/2011/05/24/orderby-string-in-linq-c-net-dynamic-sorting-of-anonymous-types/ – Likurg

1

試試這個,

int numberOfObjectsPerPage = 20; 
var queryResultPage = dataTable.OrderBy(c => c.columnName).Select(r => r).Skip(numberOfObjectsPerPage * pageNumber).Take(numberOfObjectsPerPage); 
+0

主要問題是列名。我應該如何通過它 – user1884709

1

試試這個

var Query = dataTable.Select(o=>o).OrderBy(o=>o.columnName).Skip(pageSize * pageNumber).Take(N); 

編輯

對於傳遞列名,你應該添加此代碼

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending) 
    { 
     var param = Expression.Parameter(typeof(T), "p"); 
     var prop = Expression.Property(param, SortField); 
     var exp = Expression.Lambda(prop, param); 
     string method = Ascending ? "OrderBy" : "OrderByDescending"; 
     Type[] types = new Type[] { q.ElementType, exp.Body.Type }; 
     var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp); 
     return q.Provider.CreateQuery<T>(mce); 
    } 

然後你可以把它用這種方式

var values = dataTable.OrderByField("columnName");