2014-01-14 3 views
2

Мне нужна небольшая помощь для создания универсального метода для извлечения данных из dbcontext и передачи параметра orderby в качестве параметра.Динамическое выражение для предложения generic 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

Рекомендация: положите свое решение в качестве ответа, чтобы вопрос не отображался как «неотвеченный». Вы также можете получить репутацию от upvotes таким образом. – 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)) 

Я надеюсь, что это кому-то помочь.