我希望能够存储一个表达式列表,以便稍后使用IQueryable.OrderBy执行,例如:
List<Expression<Func<MyType, object>>> list = new List<Expression<Func<MyType, object>>>();
list.Add(x => x.Date);
list.Add(x => x.ID);
IOrderedQueryable<MyType> qry = query.OrderBy(list[0]).ThenBy(list[1]);
但是执行此操作会抛出InvalidOperationException - 无法按类型'System.Object'排序,因为表达式是使用object定义的,而不是像Expression<Func<MyType, DateTime>>
或Expression<Func<MyType, int>>
如何存储表达式列表,以便稍后在OrderBy方法中执行它们?
答案 0 :(得分:1)
您只需要添加此订购吗?您以后不需要动态删除内容?如果是这种情况,那就相对简单了:
using System;
using System.Linq;
using System.Linq.Expressions;
class QueryOrdering<T>
{
private Func<IQueryable<T>, IOrderedQueryable<T>> function;
public void AddOrdering<TKey>(Expression<Func<T, TKey>> keySelector)
{
if (function == null)
{
function = source => source.OrderBy(keySelector);
}
else
{
// We need to capture the current value...
var currentFunction = function;
function = source => currentFunction(source).ThenBy(keySelector);
}
}
public IOrderedQueryable<T> Apply(IQueryable<T> source)
{
if (function == null)
{
throw new InvalidOperationException("No ordering defined");
}
return function(source);
}
}
我不喜欢这个使用变异的事实......编写一个不可变版本并不太难,AddOrdering
使用新函数返回一个新的QueryOrdering<T>
。 / p>