.net 使用动态OrderBy进行分页/分页的Linq表达式

.net 使用动态OrderBy进行分页/分页的Linq表达式,.net,linq,.net-4.0,pagination,entity-framework-4.1,.net,Linq,.net 4.0,Pagination,Entity Framework 4.1,全部, 我正在尝试使用网格进行分页。为了做到这一点,我必须通过哪个字段进行排序。我不知道如何使用Linq查询来实现这一点。我正在使用.NET4/EF4.1。在下面的两个例子中,#1可以很好地工作。问题是,我正在传递字段以进行排序,因此我需要能够动态更改排序依据。当我尝试使用示例2中的字符串时,它不会按表达式排序。有没有办法做到这一点?似乎很多人都需要这个功能 [Example 1] (from e in _context.MyEntity where (MyWhereClause)

全部,

我正在尝试使用网格进行分页。为了做到这一点,我必须通过哪个字段进行排序。我不知道如何使用Linq查询来实现这一点。我正在使用.NET4/EF4.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);

-谢谢-

使用

首先,您需要将orderby从查询中拉出来,并使用扩展方法版本

   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);
var query = from e in _context.MyEntity
            where (MyWhereClause)
            select e;

query = query.DynamicOrderBy("property");

query = query.Skip(Offset).Take(MyCountPerPage);
接下来,我们必须构建
dynamiccorderby
,我假设查询是针对某种
IQueryable

//需要它来正确构造查询
静态MethodInfo s_orderBy=typeof(Queryable).GetMethods().First(m=>m.Name==“orderBy”);
静态IOrderedQueryable DynamicCorderby(此IQueryable源,字符串属性)
{
var expr=source.Expression;
var p=表达式参数(typeof(T),“x”);
var propInfo=typeof(T).GetProperty(属性,BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
var sortExpr=Expression.Lambda(Expression.Property(p,propInfo),p)
var方法=s_orderBy.MakeGenericMethod(typeof(T),propInfo.PropertyType);
var call=Expression.call(方法、表达式、分类器);
var newQuery=source.Provider.CreateQuery(调用);
将newQuery作为IOrderedQueryable返回;
}

我想,jqGrid需要这个。我之前发布了完整的,你可以用它作为例子

其主要思想是,实体框架可以与
ObjectQuery
一起使用,后者支持您需要的“SomeField,ASC”之类的排序。因此,您可以在不使用动态LINQ扩展的情况下实现所需的所有功能。更重要的是,你可以像这样使用构造

.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))
.Where(“it.equipmentID<@maxId”,新对象参数(“maxId”,100))
其中包含字符串参数(“it.equipmentID<@maxId”)。因此,您可以使用jqGrid所需的字符串参数实现所有分页、排序和过滤。我开始回答的示例演示了如何做到这一点。

可能重复的
.Where("it.equipmentID < @maxId", new ObjectParameter ("maxId", 100))