我正在使用Pro Asp.Net Web Api Http Web Services中描述的通用实体存储库
Asp.Net Tugberk Ugurlu等人
分页功能如下。请关注第三个参数' keySelector'
public PaginatedList<T> Paginate<TPaginatedKey>(int pageIndex, int pageSize, Expression<Func<T, TPaginatedKey>> keySelector,
Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includeProperties)
{
m_EntitiesContext.Set<T>().OrderBy(keySelector);
... // Removed some code here.
}
以上方法调用如下。
m_Repository.Paginate<short>(cmd.Page, cmd.Take, x => x.Id, null);
所以这里第三个参数keySelector
的参数是x => x.Id
。正如您所料,它按Id排序,并且硬编码为Id。现在我想概括一下,以便在运行时我能够按Id,ModifiedDate,FirstName或基于字符串参数的顺序排序,例如&#34; Id&#34;或&#34; ModifiedDate&#34;或&#34; FirstName&#34;。那么有人可以请我如何基于字符串生成或创建Expression<Func<T, TPaginatedKey>>
表达式?我想它应该很简单,但我无法做到。
答案 0 :(得分:1)
我相信你所寻找的是Expression Trees,它可以让你构建动态表达。
取自链接中的示例,这是他们通过
执行动态订单的方式MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderBy",
new Type[] { queryableData.ElementType, queryableData.ElementType },
whereCallExpression,
Expression.Lambda<Func<string, string>>(pe, new ParameterExpression[] { pe }));
// Create an executable query from the expression tree.
IQueryable<string> results = queryableData.Provider.CreateQuery<string>(orderByCallExpression);