列出OrderBy的表达式

时间:2009-09-10 10:37:02

标签: c# linq linq-to-sql lambda

我希望能够存储一个表达式列表,以便稍后使用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方法中执行它们?

1 个答案:

答案 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>