Linq-to-sql orderbybyby

时间:2010-05-25 19:52:57

标签: linq-to-sql sql-order-by

我正在使用以下查询语法

from table
where 
where
orderby 
orderby

第一个orderby是日期,第二个orderby是日期。我认为这会像orderby那样工作,但似乎正在做其他事情。

  1. 如何在不使用扩展语法的情况下使用上述语法进行排序。 (知道了)

  2. orderby,orderby做了什么?

4 个答案:

答案 0 :(得分:47)

  

如何使用上述语法而不使用扩展语法来执行命令。

在字段之间使用逗号:

orderby a, b

  

orderby,orderby做了什么?

当您连续两次使用orderby时,元素在概念上将首先使用第一个orderby进行排序,然后使用第二个orderby再次排序。因为排序被定义为stable sort(与第二个orderby绑定的对象将保持与使用第一个orderby排序后相同的顺序,它实际上意味着:< / p>

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术语与您可能想要的术语交换。

使用LINQ to SQL测试

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

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子句中,但顺序与您的预期相反。

答案 1 :(得分:8)

Query Expression Syntax中执行ThenBy是直截了当的,只需用逗号和第二个语句跟随初始orderby:

// 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时间来计算第一个订单。

这实际上直接在MSDN documentation中为Enumerable.OrderBy和Enumerable.ThenBy方法回答。

  

因为IOrderedEnumerable   继承自IEnumerable,你可以   调用OrderBy或OrderByDescending   调用OrderBy的结果,   OrderByDescending,ThenBy或   ThenByDescending。这样做   介绍了一个新的主要订购   忽略了之前建立的   排序

答案 2 :(得分:8)

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);

您可以在此处查看更多相关信息: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204

答案 3 :(得分:0)

theby的答案应该是这样的

命令1,2

我会把第2部分留给其他人。