【发布时间】:2013-05-16 16:41:39
【问题描述】:
我正在寻找一种方法来存储用于对元素排序的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 这样的外部库。
【问题讨论】:
-
顺便说一句,您的代码不起作用,您需要调用一次
OrderBy()并使用ThenBy()进行后续调用。 -
正如我在问题中所说,这只是伪代码......事实上,我已经有了解决问题的方法,但是使用了我想避免的动态 Linq 库。所以你提到的订购问题已经解决了:),但还是谢谢你!
标签: c# .net entity-framework lambda expression-trees