我正在寻找一种方法来存储Expression<Func<T, TProperty>>
用于排序元素的集合,然后针对IQueryable<T>
对象执行存储的列表(底层提供程序是实体框架)。
例如,我想做这样的事情(这是伪代码):
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);
}
}
一个 order by 子句(订购的属性):
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; }
}
}
带有我的查询方法的存储库:
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();
}
}
我的第一个想法是将 转换Expression<Func<T, TProperty>>
为字符串(要排序的属性名称)。所以基本上,我没有存储一个类型化的列表(这是不可能的,因为 TProperty 不是常量),我存储了一个字符串列表,其中包含要排序的属性。
但这不起作用,因为那时我无法重建Expression
背面(我需要它,因为 IQueryable.OrderBy 需要一个Expression<Func<T, TKey>>
作为参数)。
我还尝试动态创建表达式(在 Expression.Convert 的帮助下),Expression<Func<T, object>>
但后来我从实体框架中得到一个异常,说它无法处理 Expression.Convert 语句。
如果可能的话,我不想使用像Dynamic Linq Library这样的外部库。