Linq 表达式,用于使用动态 OrderBy 进行分页/分页



All,

我正在尝试使用网格进行分页。 为此,我必须传入要排序的字段。 我不知道如何使用 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);

-谢谢-

使用动态 LINQ

首先,您需要将 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>;
}

我想,jqGrid需要这个。我在回答之前发布了完整的VS2008项目,您可以将其用作示例。

主要思想是实体框架可以与支持排序的ObjectQuery<T>一起使用,例如您需要的"SomeField,ASC"。因此,您可以在没有动态 LINQ 扩展的情况下实现所需的一切。甚至更多(见这里(你可以使用这样的结构

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

WHERE 具有字符串参数("it.equipmentID <@maxId"(。因此,您可以使用 jqGrid 所需的字符串参数实现所有分页、排序和过滤。我开始回答的示例演示了如何做到这一点。

   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);

相关内容

  • 没有找到相关文章

最新更新