我正在尝试在LINQ中同时根据多个列进行排序。
要实现此排序列表,我应该使用SortBy
作为第一列,然后使用多个ThenBy
将OrderBy
的结果按另一列进行排序。
但问题是我在使用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.Nullable1[<>f__AnonymousType1
1 [System.Object的]'
答案 0 :(得分:2)
ThenBy
是IOrderedQueryable
上的扩展方法,而不是IEnumerable
。如果您想致电ThenBy
,则应将其投放到IOrderedQueryable
:
var r = ((IOrderedQueryable<dynamic>)result).ThenBy(...);
正如juharr所评论的那样,您甚至可以展开它以检查类型,然后选择ThenBy
或OrderBy
,使用相同的谓词进行过滤。
答案 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
)。