Sto cercando un modo per memorizzare una raccolta di Expression<Func<T, TProperty>>
utilizzata per ordinare elementi e quindi per eseguire l'elenco memorizzato su un oggetto IQueryable<T>
(il provider sottostante è Entity Framework) .Elenco di espressioni <Func <T, TProperty >>
Per esempio, mi piacerebbe fare qualcosa di simile (questo è pseudo codice):
public class Program
{
public static void Main(string[] args)
{
OrderClause<User> orderBys = new OrderClause<User>();
orderBys.AddOrderBy(u => u.Firstname);
orderBys.AddOrderBy(u => u.Lastname);
orderBys.AddOrderBy(u => u.Age);
Repository<User> userRepository = new Repository<User>();
IEnumerable<User> result = userRepository.Query(orderBys.OrderByClauses);
}
}
una clausola ORDER BY (proprietà su cui ordinare):
public class OrderClause<T>
{
public void AddOrderBy<TProperty>(Expression<Func<T, TProperty>> orderBySelector)
{
_list.Add(orderBySelector);
}
public IEnumerable<Expression<Func<T, ???>>> OrderByClauses
{
get { return _list; }
}
}
Un repository con il mio metodo di query:
public class Repository<T>
{
public IEnumerable<T> Query(IEnumerable<OrderClause<T>> clauses)
{
foreach (OrderClause<T, ???> clause in clauses)
{
_query = _query.OrderBy(clause);
}
return _query.ToList();
}
}
I miei abeti L'idea era di convertire lo Expression<Func<T, TProperty>>
in una stringa (il nome della proprietà su cui ordinare). Quindi, in pratica, invece di memorizzare una lista tipizzata (che non è possibile perché TProperty non è costante), memorizzo una lista di stringhe con le proprietà su cui ordinare.
Ma questo non funziona perché poi non riesco a ricostruire la Expression
posteriore (ne ho bisogno perché IQueryable.OrderBy vuole un Expression<Func<T, TKey>>
come parametro).
Ho anche provato a creare dinamicamente l'espressione (con l'aiuto di Expression.Convert), per avere un Expression<Func<T, object>>
ma poi ho ottenuto un'eccezione dal framework di entità che diceva che non era in grado di gestire l'istruzione Expression.Convert.
Se possibile, non voglio utilizzare una libreria esterna come Dynamic Linq Library.
BTW, il tuo codice non funzionerà, dovrai chiamare 'OrderBy()' una volta e usare 'ThenBy()' per le chiamate successive. – svick
Come ho affermato nella mia domanda, questo era solo uno pseudo codice ... In effetti, avevo già una soluzione al mio problema, ma con l'uso della Dynamic Linq Library che volevo evitare. Quindi il problema degli ordini che hai menzionato era già risolto :), ma grazie comunque! – Bidou