Linq to sql Linq到sql orderby thenby

Linq to sql Linq到sql orderby thenby,linq-to-sql,sql-order-by,Linq To Sql,Sql Order By,我使用以下查询语法 from table where where orderby orderby 其中第一个orderby是日期,第二个orderby是日期。我认为这将像orderby thenby一样工作,但似乎在做其他事情 如何在不使用扩展语法的情况下使用上述语法执行orderby。明白了 orderby,orderby做什么 thenby的答案应该是这样的 订购人1,2 我将把第二部分留给其他人 如何在不使用扩展语法的情况下使用上述语法执行orderby 在字段之间使用逗号: ord

我使用以下查询语法

from table
where 
where
orderby 
orderby
其中第一个orderby是日期,第二个orderby是日期。我认为这将像orderby thenby一样工作,但似乎在做其他事情

如何在不使用扩展语法的情况下使用上述语法执行orderby。明白了

orderby,orderby做什么


thenby的答案应该是这样的

订购人1,2

我将把第二部分留给其他人

如何在不使用扩展语法的情况下使用上述语法执行orderby

在字段之间使用逗号:

orderby a, b
orderby,orderby做什么

当您在一行中两次使用orderby时,从概念上讲,元素将首先使用第一个orderby排序,然后使用第二个orderby再次排序。由于排序被定义为与第二个orderby绑定的对象将保持与与第一个orderby排序后相同的顺序,因此这实际上意味着:

var query = from x in l
            orderby x.A
            orderby x.B
            select x;
相当于:

var query = from x in l
            orderby x.B, x.A
            select x;
结果是orderby术语与您可能想要的术语进行了交换

用LINQtoSQL测试它

这可以通过在LINQtoSQL中尝试来验证。我创建了以下查询:

var query = from a in dc.Orders
            orderby a.Date
            orderby a.CustomerID
            select a;
这就是生成的SQL:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description]
FROM [dbo].[Order] AS [t0]
ORDER BY [t0].[CustomerID], [t0].[Date]
请注意,orderby a.Date不会被忽略。这两个术语都包含在ORDER BY子句中,但顺序与您预期的相反。

执行ThenBy in是严格的,只需在ORDER BY的开头加上逗号和第二个语句:

// Create the data source.
List<Student> students = GetStudents();

// Create the query.
IEnumerable<Student> sortedStudents =
    from student in students
    orderby student.Last ascending, student.First ascending
    select student;
使用标准查询运算符扩展方法应用第二个orderby实际上会将第二个orderby应用于包含第一个orderby的查询结果的结果。实际上,只有第二个orderby将应用,尽管您仍将花费CPU时间计算第一个订单

对于Enumerable.OrderBy和Enumerable.ThenBy方法,这实际上是在中直接回答的

因为它是无数的 继承自IEnumerable,您可以 调用OrderBy或OrderByDescending on 调用OrderBy的结果, 按降序排序,然后按或 然后下降。这样做 引入了一个新的主订单 忽略先前建立的 订购

ThenBy运算符对序列应用辅助的升序排序顺序。这类似于在T-SQL中应用二级排序顺序,如:

Select * from Customer order by FirstName,lastName
在linq中,我们可以这样写:

var thenby = mode.CustList.Select(cus => new
        {
            cus. FirstName,
            cus. LastName,
            cus. EmailAddress
        }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName);
您可以在此处查看更多信息:

根据规范,OrderBy始终是一个稳定的排序,无论LINQ提供程序如何。这意味着,如果两个元素的键相等,那么元素的顺序将保持不变。chained OrderBy是否会保留排序取决于所使用的键,而不是LINQ提供程序,尽管这显然会影响键值。@hemp:在进一步搜索之后,我认为您是对的。奇怪的是,虽然您自己的答案引用了MSDN的话,但这样做会引入一个新的主排序,忽略先前建立的排序。与你刚才在评论中所说的相矛盾。但我认为它的MSDN是错误的。它没有直接矛盾,只是让人困惑。它的意思是,现有的订单不会被新的主订单考虑在内。但是,一旦应用了初始排序,如果新排序发现键值相等,则不会重新排序这些项。所以事实上这两种说法都是正确的,只是不太清楚。@hemp:好的,我想我现在明白了。我不得不同意你的看法,那是令人困惑的我已经用LINQtoObjects和LINQtoSQL对它进行了测试,排序在这两种情况下都是稳定的。我不得不说,我有点惊讶,SQL完全是它应该的样子——一个简单的ORDERBY,术语颠倒了。有人在那里做得很好!