直接使用多个ThenBy,无需任何订单

时间:2017-05-02 13:12:12

标签: c# linq

我正在尝试在LINQ中同时根据多个列进行排序。

要实现此排序列表,我应该使用SortBy作为第一列,然后使用多个ThenByOrderBy的结果按另一列进行排序。

但问题是我在使用ThenBy时没有任何顺序,因为用户选择第一列,我将此列用作OrderBy的参数,其余部分列是ThenBy的参数。

所以我首先声明一个动态全局变量,如:

dynamic result;

然后创建一个实体模型,如:

DatabaseEntityContext context = new DatabaseEntityContext();

查询数据以获得足够的匿名数据类型:

    var query1 = db.context.Select(x => new { Column1 = x.Column1, Column2 = x.Column2,
 Column3 = x.Column3, Column4 = x.Column4, Column5 = x.Column5 }).ToList();

    var query2 = query1.Select(x => new { Column1 = x.Column1, Column2 = x.Column2,
 Column3 = x.Column3, TotalColumn = x.Column4 + "-" + x.Column5 }).ToList();

最后将query2分配给result,如:

result = query2;

要在result上使用LINQ函数,我将其转换为((IEnumerable<dynamic>)result) 但事情是这个演员的结果没有任何ThenBy扩展,我不能先使用OrderBy,因为列表可能已经被另一列排序了,我应该使用{{1根据以前排序的列表的结果再次对其进行排序。

我的问题是,我在ThenBy中使用了多个因素,但我无法对此进行排序,因为我应先ThenBy,然后在OrderBy之后使用ThenBy我无法直接使用OrderBy

那么我怎样才能将ThenBy直接用于先前排序的列表?!

更新1: 根据@Patrick Hofman,我将我的演员类型更改为ThenBy,如:

IOrderedQueryable

但是它没有给我result = ((IOrderedQueryable<dynamic>)result).ThenBy(x => x.MyDynamicField).ToList(); 编译错误:

  

表达式树可能不包含动态操作

我也测试"x.MyDynamicField",但它会出现IOrderedEnumerable错误:

  

无法投射类型的对象   'System.Collections.Generic.List InvalidCastException 5 [System.String,System.String,的System.DateTime,System.TimeSpan,System.Nullable 1[<>f__AnonymousType1 1 [System.Object的]'

2 个答案:

答案 0 :(得分:2)

ThenByIOrderedQueryable上的扩展方法,而不是IEnumerable。如果您想致电ThenBy,则应将其投放到IOrderedQueryable

var r = ((IOrderedQueryable<dynamic>)result).ThenBy(...);

正如juharr所评论的那样,您甚至可以展开它以检查类型,然后选择ThenByOrderBy,使用相同的谓词进行过滤。

答案 1 :(得分:1)

您可以:

而不是OrderBy / ThenBy
public static class QueryableOrderBy
{
    public static IOrderedQueryable<TSource> OrderBySimple<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
    {
        var ordered = source as IOrderedQueryable<TSource>;

        if (source != null)
        {
            return ordered.ThenBy(keySelector);
        }

        return source.OrderBy(keySelector);
    }

    public static IOrderedQueryable<TSource> OrderByDescendingSimple<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
    {
        var ordered = source as IOrderedQueryable<TSource>;

        if (source != null)
        {
            return ordered.ThenByDescending(keySelector);
        }

        return source.OrderByDescending(keySelector);
    }
}

这些方法将“分析”是否已有另一个OrderBy(然后他们将使用ThenBy)。