2011-04-13 73 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过滤。我开始回答的例子说明了你如何做到这一点。