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