2011-04-13 75 views
3

全部,Linq表達式的分頁/分頁動態OrderBy

我正在嘗試使用網格獲得分頁工作。爲了做到這一點,我必須通過在哪個領域進行排序。我無法弄清楚如何用Linq查詢來做到這一點。我正在使用.NET 4/EF 4.1。在下面的兩個例子中,#1工作得很好。問題是,我正在通過現場排序,因此我需要能夠動態地改變我們正在排序的內容。當我嘗試像例2那樣使用字符串時,它不會按照我的表達式進行排序。有什麼辦法可以做到這一點?看起來很多人應該需要這個功能。

[Example 1] 
(from e in _context.MyEntity 
where (MyWhereClause) 
orderby e.SomeProperty Ascending 
select e).Skip(Offset).Take(MyCountPerPage); 

    [Example 2] 
(from e in _context.MyEntity 
where (MyWhereClause) 
orderby "SomeField, ASC" 
select e).Skip(Offset).Take(MyCountPerPage); 

-Thanks-

+0

的可能重複的[動態LINQ的OrderBy](http://stackoverflow.com/questions/41244/dynamic-linq-orderby) – 2011-04-13 16:38:48

回答

-2
var query = (from e in _context.MyEntity 
    where (MyWhereClause) 
    orderby e.SomeProperty Ascending 
    select e).Skip(Offset).Take(MyCountPerPage); 

    if(Ascendingflag) 
     query = query.OrderBy(a = > SortExpression); 
    else 
     query = query.OrderByDescending(a = > SortExpression); 
1

首先,你要拉你出來的OrderBy查詢和使用方法的擴展版本,

var query = from e in _context.MyEntity 
      where (MyWhereClause) 
      select e; 

query = query.DynamicOrderBy("property"); 

query = query.Skip(Offset).Take(MyCountPerPage); 

接下來,我們必須構建DynamicOrderBy,我假設查詢是針對某種IQueryable<T>

//Need this to construct the query correctly 
static MethodInfo s_orderBy = typeof(Queryable).GetMethods().First(m => m.Name == "OrderBy"); 

static IOrderedQueryable<T> DynamicOrderBy<T>(this IQueryable<T> source, string property) 
{ 
    var expr = source.Expression; 
    var p = Expression.Parameter(typeof(T), "x"); 
    var propInfo = typeof(T).GetProperty(property, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
    var sortExpr = Expression.Lambda(Expression.Property(p, propInfo), p) 
    var method = s_orderBy.MakeGenericMethod(typeof(T), propInfo.PropertyType); 
    var call = Expression.Call(method, expr, sortExpr); 
    var newQuery = source.Provider.CreateQuery<T>(call); 
    return newQuery as IOrderedQueryable<T>; 
} 
0

我想,你需要這個jqGrid的。我the answer之前張貼與全VS2008 project它可以作爲一個例子使用。

主要的想法是,實體Framwork可以ObjectQuery<T>它支持排序,如「SomeField,ASC」你需要使用。所以你可以實現你所需要的全部而不需要動態LINQ擴展。更(見here),你可以使用像建設

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100)) 

與具有WHERE字符串參數( 「it.equipmentID < @maxId」)。所以,你可以實現所有分頁,排序和使用字符串參數,你需要的jqGrid過濾。我開始回答的例子說明了你如何做到這一點。