如何生成表达式<func <t,tpaginatedkey =“”>&gt;表达式基于字符串?

时间:2015-10-20 08:05:32

标签: c# linq linq-expressions

我正在使用Pro Asp.Net Web Api Http Web Services中描述的通用实体存储库

Asp.Net Tugberk Ugurlu等人

分页功能如下。请关注第三个参数&#39; keySelector&#39;

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>>表达式?我想它应该很简单,但我无法做到。

1 个答案:

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