将Lamdas的多个订单存储到列表中以供稍后执行

时间:2018-03-18 12:36:55

标签: c# .net linq

我想将两个不同的排序表达式存储到列表中,然后想要使用orderBy linq执行它。

我有以下代码。

class Product 
{
    public int Id { get; set; }
    public String Name {get; set;}
}

List<?> GetSortExpressions() {
      Expression<Func<Product, int>> idSortExpression= p => p.Id;
      Expression<Func<Product, String>> nameSortExpression = p => p.Name;

      List<?> sorts = new List<?>();
      sorts.Add(idSortExpression);
      sorts.Add(nameSortExpression );
      return sorts;
}

然后我想在IQueryable对象上执行排序列表,如下所示。

IQueryable<T> ApplySortExpressions(IQueryable<T> data, List<?> sorts) {
    for(int i=0;i < sorts.Count; i++) {
        if(i == 0) {
            data = data.OrderBy(sorts[i]);
        } else {
            data = ((IOrderedQueryable<T>)data).ThenBy(sorts[i]);
        }
    }
    return data;
}

由于类型错误,我无法将表达式添加到列表中。你能否在下面给我一个正确的列表通用类型?

List<?> sorts = new List<?>();

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以列出类型&#34; Expression&#34;然后你应该能够将两个表达式存储在同一个列表中,但是你必须在ApplySortExpressions方法中将表达式转换回它们所需的类型,否则你不能在OrderBy或ThenBy方法中使用它们

答案 1 :(得分:0)

您可以将它们存储为Expression<Func<Product, object>>>。然后你的功能变成:

List<Expression<Func<Product, object>>> GetSortExpressions() {
    Expression<Func<Product, object>> idSortExpression = p => p.Id;
    Expression<Func<Product, object>> nameSortExpression = p => p.Name;

    var sorts = new List<Expression<Func<Product, object>>>();
    sorts.Add(idSortExpression);
    sorts.Add(nameSortExpression);
    return sorts;
}

IQueryable<T> ApplySortExpressions<T>(IQueryable<T> data, List<Expression<Func<T, object>>> sorts) {
    for (int i = 0; i < sorts.Count; i++) {
        if (i == 0) {
            data = data.OrderBy(sorts[i]);
        }
        else {
            data = ((IOrderedQueryable<T>) data).ThenBy(sorts[i]);
        }
    }

    return data;
}