2014-01-14 57 views
2

我需要一点帮助来创建一个从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 

在runtime.I希望避免只为排序表达式发送额外的类型。

Expression<Func<T, TKey>> orderby 

随着当前实现与字符串参数 像

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

但如果我尝试通过INT参数排序

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

抛出exception.Is什么我想没问题实现?任何帮助和建议表示赞赏。 感谢

+0

建议:将您的解决方案作为答案,以便该问题不会显示为“未答复”。你也可以通过这种方式得到赞扬。 – DarkWanderer

回答

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

我希望帮助别人。