【发布时间】:2016-06-25 10:40:23
【问题描述】:
我正在构建一个存储库,并希望能够将排序列表传递给一个函数,以便以正确的顺序接收实体并可能分页。
我发现,如果您使用反向排序列表并对每个排序表达式使用 Orderby,则 linq 将正确排序。
foreach (var s in sorts.Reverse())
{
query = query.OrderBy(s);
}
但是,在测试添加排序方向时,我发现它只采用第一个排序方向,并且似乎将该方向应用于每个排序。
private void applySorts(ref IQueryable<TEntity> query, Dictionary<Expression<Func<TEntity, dynamic>>, string> sorts)
{
if (sorts != null)
{
foreach (var s in sorts.Reverse())
{
Expression<Func<TEntity, dynamic>> expr = s.Key;
string dir = s.Value;
if (dir == "d")
{
query = query.OrderByDescending(expr);
}
else
{
query = query.OrderBy(expr);
}
}
}
}
我最初尝试在第一次排序时使用 OrderBy,然后切换到 ThenBy,但这不可能,因为 ThenBy 需要 IOrderedQueryable 类型。
我想注意使用字典可能不是最好的,如果您有更好的想法,请分享。但是,我只是想让它运行起来,看看情况如何。
我正在使用 C#、Linq 和实体框架。
提前感谢您的宝贵时间。
更新:不幸的是,我发现这不支持数字排序。错误(无法将类型“System.Int32”转换为类型“System.Object”。)
【问题讨论】:
-
我会使用一个 SortedDictionary,键是一个自定义类,它继承了实现方法 CompareTo() 的 IComparable。见帖子:stackoverflow.com/questions/4188013/…
标签: c# linq sorting repository-pattern