Szukam sposobu na przechowywanie kolekcji Expression<Func<T, TProperty>>
używanej do zamawiania elementów, a następnie do wykonania zapisanej listy na obiekcie IQueryable<T>
(podstawowym dostawcą jest Entity Framework) .Lista wyrażeń <Func <T, TProperty >>
Na przykład, chciałbym zrobić coś takiego (to pseudokod):
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);
}
}
klauzuli ORDER BY (nieruchomość, na której można zamówić):
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; }
}
}
Repozytorium z moją metodą zapytania:
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();
}
}
Moje pierwsze t pomysłem było przekonwertowanie Expression<Func<T, TProperty>>
na ciąg znaków (nazwa właściwości do sortowania). Więc, zasadniczo, zamiast przechowywania wpisanej listy (która nie jest możliwa, ponieważ TProperty nie jest stała), przechowuję listę ciągów z właściwościami do sortowania.
Ale to nie działa, ponieważ wtedy nie mogę zrekonstruować Expression
z powrotem (potrzebuję go, ponieważ IQueryable.OrderBy przyjmuje Expression<Func<T, TKey>>
jako parametr).
Próbowałem również dynamicznie utworzyć wyrażenie (za pomocą Expression.Convert), aby uzyskać Expression<Func<T, object>>
, ale dostałem wyjątek od struktury obiektu, który powiedział, że nie był w stanie obsłużyć instrukcji Expression.Convert.
Jeśli to możliwe, nie chcę korzystać z biblioteki zewnętrznej, takiej jak Dynamic Linq Library.
BTW, twój kod nie zadziałałby, musisz wywołać 'OrderBy()' raz i użyć 'ThenBy()' dla kolejnych wywołań. – svick
Jak powiedziałem w moim pytaniu, to był po prostu pseudo kod ... W rzeczywistości miałem już rozwiązanie mojego problemu, ale z wykorzystaniem Dynamic Linq Library, którego chciałem uniknąć. Tak więc problem z zamówieniem, o którym wspomniałeś, został już rozwiązany :), ale i tak dziękuję! – Bidou