C# LiNQ在OrderBy之后使用ThenBy

C# LiNQ在OrderBy之后使用ThenBy,c#,mysql,sql,linq,sql-order-by,C#,Mysql,Sql,Linq,Sql Order By,我有一个OrderBy Statements集合和数量,它们使用query.Sort参数进行排序 switch (filters.Sort) { case "new": query = query.OrderByDescending(a => a.CreatedAt); break; case "old": query = query.OrderBy(a => a.CreatedAt); break;

我有一个OrderBy Statements集合和数量,它们使用query.Sort参数进行排序

switch (filters.Sort)
{
    case "new":
        query = query.OrderByDescending(a => a.CreatedAt);
        break;
    case "old":
        query = query.OrderBy(a => a.CreatedAt);
        break;
    case "salary-asc":
        query = query.OrderBy(a => a.Profile.CompensationTypeRate.FromCompensation);
}
现在我需要使用
query.Grade
参数应用另一种排序。我知道我应该使用
ThenBy
来生成多个Order语句,但在这种情况下,我不能在一行中编写它

有没有一种方法可以编写
OrderBy
then-by
,这样它们就可以一个接一个地执行,而不是在一行中执行


或者我可以创建一些匿名函数,其中包含我的
OrderBy
ThenBy
条件吗?

如果使用类型为
IOrderedQueryable
的变量,则可以分两部分执行此操作-这就是启用
ThenBy
的原因。例如:

IOrderedQueryable<Application> ordered;

switch (filters.Sort)
{
    case "new":
        ordered = query.OrderByDescending(a => a.CreatedAt);
        break;
    case "old":
        ordered = query.OrderBy(a => a.CreatedAt);
        break;
    case "salary-asc":
        ordered = query.OrderBy(a => a.Profile.CompensationTypeRate.FromCompensation);
    default:
        // You need to work out what you want to do here. Maybe just
        // order by ID? You need to order by *something* to start with
        // in order to use ThenBy
}

// Apply the same secondary ordering, regardless of the primary one
ordered = ordered.ThenBy(x => x.Grade);

// You can then continue to use ordered, or assign the value back
// to query:
query = ordered;
IOrderedQueryable-ordered;
开关(filters.Sort)
{
案例“新”:
ordered=query.OrderByDescending(a=>a.CreatedAt);
打破
案例“旧”:
ordered=query.OrderBy(a=>a.CreatedAt);
打破
案例“工资asc”:
ordered=query.OrderBy(a=>a.Profile.CompensationTypeRate.FromCompensation);
违约:
//你需要弄清楚你想在这里做什么也许只是
//按ID订购?你需要先按*某物*订购
//为了使用ThenBy
}
//应用相同的二级排序,而不考虑主排序
有序=有序。然后按(x=>x.Grade);
//然后,您可以继续使用ordered,或将值重新赋值
//要查询:
查询=订购;

请注意,所有这些仍然是懒惰的。在您尝试使用结果之前,实际上不会进行排序。

Daisy的答案是正确的。值得指出的是,在各种情况下,您都可以像这样将IEnumerables链接在一起。在对IEnumerable求值之前,该链不会执行,比如在for each循环中,或者在ToList()调用中。@VictorWilson:我会在回答中提到这一点,谢谢。请注意,不需要单独的变量,您可以强制转换:
((IOrderedQueryable)查询)。然后通过(…)
。您还可以检查查询是否为可查询的
IOrderedQueryable
,如果是-应用
ThenBy
,否则应用常规的
OrderBy
。查询变量的类型为可查询的IQueryable;其中应用程序只是一个类。我如何将其强制转换或声明为IOrderedQueryable?@Jalle:您不会更改
query
——您会引入一个类型为
IOrderedQueryable
的新变量,就像我在示例中所做的那样。