通用orderby子句的动态表达式

时间:2014-01-14 11:40:39

标签: c# linq entity-framework lambda dynamic-function

我需要一些帮助来创建从dbcontext获取数据的通用方法,并将'orderby'子句作为参数传递。

到目前为止,设法做到了这一点:

public virtual Task<List<T>> GetListAsync(Expression<Func<T, object>> orderby, bool asc = true)
{
    IQueryable<T> dbQuery = _dbContext.Set<T>();
    if (orderby != null)
    {
        UnaryExpression UnExp = (UnaryExpression)orderby.Body;
        MemberExpression Exp = (MemberExpression)UnExp.Operand;
        var propInfo = (PropertyInfo)Exp.Member;

        //need new sort expression

        dbQuery = asc ? dbQuery.OrderBy(orderby) : dbQuery.OrderByDescending(orderby);
    }
    return dbQuery.ToListAsync<T>();
}

我需要帮助的部分是如何转换

Expression<Func<T, object>> orderby

Expression<Func<T, "propInfo.PropertyType">> sortExpression

在运行时。我想避免仅为sort表达式发送额外的类型。

Expression<Func<T, TKey>> orderby

使用当前实现,字符串参数没有问题 像

 var data = await GetListAsync(it => it.Name);

但如果我尝试按int参数排序

var data = await GetListAsync(it => it.Id);

抛出异常。这就是我想要的东西吗?任何帮助和建议表示赞赏。 感谢

1 个答案:

答案 0 :(得分:1)

经过更多的研究,我提出了这个解决方案:

public virtual Task<List<T>> GetListAsync(Func<IQueryable<T>, IOrderedQueryable<T>> orderby)
{
    IQueryable<T> dbQuery = _dbContext.Set<T>();
    if (orderby != null)
    {
        if (orderby != null)
        {
            dbQuery = orderby(dbQuery);
        }
    }
    return dbQuery.ToListAsync<T>();
}

和用法:

var data = await GetListAsync(q => q.OrderBy(it => it.Name))

我希望这有助于某人。