2010-05-25 77 views
27

Tôi đang sử dụng cú pháp truy vấn sau đâyLINQ-to-sql orderby ThenBy

from table 
where 
where 
orderby 
orderby 

Trường hợp orderby đầu tiên là một ngày và orderby thứ hai là một ngày. Tôi sẽ giả định điều này sẽ làm việc như orderby sau đó nhưng dường như đang làm một cái gì đó khác.

  1. Tôi có thể làm một đơn đặt hàng sau đó bằng cách sử dụng cú pháp ở trên mà không sử dụng cú pháp mở rộng. (OK)

  2. Và thứ tự orderby, orderby làm gì?

Trả lời

43

Tôi có thể làm một đơn đặt hàng sau đó bằng cách sử dụng cú pháp ở trên mà không sử dụng cú pháp tiện ích.

Sử dụng một dấu phẩy giữa các lĩnh vực:

orderby a, b 

Và những gì hiện các orderby, orderby làm gì?

Khi bạn sử dụng orderby hai lần liên tiếp các yếu tố về mặt khái niệm đầu tiên sẽ được sắp xếp bằng cách sử dụng orderby đầu tiên, và sau đó sắp xếp một lần nữa bằng cách sử dụng thứ hai orderby. Bởi vì việc phân loại được định nghĩa là một stable sort (đối tượng được gắn với thứ hai orderby sẽ vẫn theo thứ tự như sau khi phân loại với orderby đầu tiên nó có hiệu quả có nghĩa rằng đây:

var query = from x in l 
      orderby x.A 
      orderby x.B 
      select x; 

tương đương với:

var query = from x in l 
      orderby x.B, x.A 
      select x; 

kết quả là các điều khoản orderby được hoán đổi từ những gì bạn có thể mong đợi.

kiểm tra nó với LINQ to SQL

Điều này có thể được xác minh bằng cách thử trong LINQ to SQL. Tôi tạo ra các truy vấn sau đây:

var query = from a in dc.Orders 
      orderby a.Date 
      orderby a.CustomerID 
      select a; 

và đây là SQL tạo:

SELECT [t0].[ID], [t0].[CustomerID], [t0].[Date], [t0].[Description] 
FROM [dbo].[Order] AS [t0] 
ORDER BY [t0].[CustomerID], [t0].[Date] 

Lưu ý rằng orderby a.Date không bỏ qua. Cả hai điều khoản được bao gồm trong mệnh đề ORDER BY, nhưng theo thứ tự ngược lại bạn có thể đã dự định.

+0

Theo đặc điểm kỹ thuật, OrderBy luôn là một loại ổn định (bất kể nhà cung cấp LINQ.) Điều đó có nghĩa là "nếu các khóa của hai phần tử bằng nhau, thứ tự của các phần tử được giữ nguyên." Việc OrderBy's có giữ nguyên thứ tự sẽ giữ nguyên thứ tự phụ thuộc vào các khóa đang được sử dụng hay không, không phải trên nhà cung cấp LINQ (mặc dù điều đó rõ ràng sẽ ảnh hưởng đến các giá trị khóa). – hemp

+0

@hemp: Sau khi tìm hiểu thêm, tôi nghĩ bạn đúng. Kỳ lạ thay vì câu trả lời của riêng bạn, nơi bạn trích dẫn từ MSDN ('Làm điều này giới thiệu một thứ tự chính mới bỏ qua thứ tự đã thiết lập trước đó. ') Mâu thuẫn với những gì bạn vừa nói trong bình luận này. Nhưng tôi nghĩ rằng MSDN của nó đó là sai. –

+0

Nó không trực tiếp mâu thuẫn, nó chỉ là khó hiểu. Những gì nó nói là thứ tự hiện tại sẽ không được đưa vào tài khoản theo thứ tự chính mới. ** Tuy nhiên **, một khi nó áp dụng thứ tự ban đầu, nếu thứ tự mới tìm các giá trị khóa bằng nhau, nó sẽ không sắp xếp lại các mục đó. Vì vậy, trên thực tế cả hai phát biểu đều đúng, chỉ không rõ ràng. – hemp

0

Câu trả lời cho ThenBy nên như thế này

orderby 1, 2

Tôi sẽ để lại một phần # 2 cho người khác.

8

Thực hiện ThenBy trong Query Expression Syntax là straighforward, chỉ cần làm theo các orderby ban đầu với một dấu phẩy và một tuyên bố thứ 2:

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

Áp dụng orderby thứ 2 sử dụng các toán tử truy vấn chuẩn (phương pháp khuyến nông) thực sự sẽ được áp dụng thứ hai orderby đến kết quả của kết quả truy vấn bao gồm orderby đầu tiên. Trong thực tế, chỉ có thứ tự thứ hai sẽ được áp dụng, mặc dù bạn vẫn sẽ dành thời gian CPU để tính toán thứ tự đầu tiên.

Điều này thực sự được trả lời trực tiếp trong MSDN documentation cho các phương thức Enumerable.OrderBy và Enumerable.ThenBy.

Vì IOrderedEnumerable thừa hưởng từ IEnumerable, bạn có thể gọi OrderBy hoặc OrderByDescending trên kết quả của một cuộc gọi đến OrderBy, OrderByDescending, ThenBy hoặc ThenByDescending. Làm điều này giới thiệu một đơn đặt hàng chính mới mà bỏ qua việc đặt hàng trước đó được thiết lập .

7

Toán tử ThenBy áp dụng thứ tự sắp xếp thứ tự tăng dần thứ cấp. Nó cũng giống như việc áp dụng một thứ tự sắp xếp thứ trong T-SQL như:

Select * from Customer order by FirstName,lastName 

Trong LINQ chúng ta có thể viết những dòng này như:

var thenby = mode.CustList.Select(cus => new 
     { 
      cus. FirstName, 
      cus. LastName, 
      cus. EmailAddress 
     }).OrderBy(cus => cus. FirstName).ThenBy(cus => cus. LastName); 

Bạn có thể kiểm tra thêm về điều này ở đây: http://dotnetreaders.com/articles/ThenBy_in_LINQ_c-sharp,_Orderby_Thenby_in_LINQ_C-sharp/204

Các vấn đề liên quan