2012-03-19 22 views
13

Câu lệnh LINQ to SQL cơ bản sau đây không dẫn đến thứ tự làm việc. Như bạn có thể thấy trong T-SQL không có orderby. Bạn có biết tại sao?LINQ to SQL không tạo ra ORDER BY khi DISTINCT được sử dụng?

LINQ to SQL:

 var results = (from stats in db.t_harvest_statistics 
         orderby stats.unit_number 
         select stats.unit_number).Distinct().ToList(); 

Kết quả trên trong sau TSQL

SELECT 
[Distinct1].[unit_number] AS [unit_number] 
FROM (SELECT DISTINCT 
[Extent1].[unit_number] AS [unit_number] 
FROM [dbo].[t_harvest_statistics] AS [Extent1] 
    ) AS [Distinct1] 
+0

là unit_number một cột sắc? – asawyer

+0

không, số thứ tự không phải là danh tính. Nó là một kiểu dữ liệu int – KeelRisk

Trả lời

28

Đó là một hạn chế của SQL và Relational Algebra của nơi ORDER BY là trong mối quan hệ đến DISTINCT.

ORDER BY phải là "tiếp tục" trong SQL (ở "cấp cao nhất") vì đây là hoạt động xem xem. Trong khi một có thể ghi SQL có ORDER BY "tiếp tục", trong mối quan hệ với một hoạt động RA, nó thường dẫn đến hành vi không xác định (đôi khi hoạt động). Trong ánh sáng này, có nghĩa là Linq2Sql là miễn phí để bỏ qua ORDER BY mặc dù, có lẽ ngoại lệ sẽ tốt hơn ... nó sẽ kém tinh tế hơn ;-) (Thực ra, cùng một vấn đề này tồn tại cho bất kỳ nhà cung cấp LINQ nào) không cung cấp định nghĩa "chặt chẽ hơn" của Phân biệt.)

Xóa Distinct() và Linq2Sql một lần nữa sẽ tạo ORDER BY như mong đợi. Giải pháp chỉ là để chuyển đổi thứ tự của các hoạt động để ORDER BY một lần nữa ở "cấp cao nhất".

này được bao phủ bởi các bài viết Use of Distinct and OrderBy in LINQ:

Hành vi này có thể xuất hiện kỳ ​​lạ. Vấn đề là toán tử Distinct không cho phép nó duy trì thứ tự ban đầu của các giá trị. Áp dụng cho LINQ to SQL, điều này có nghĩa là một ràng buộc sắp xếp có thể bị bỏ qua trong trường hợp truy vấn như queryA.

Giải pháp là của khá [i] mple: đưa các nhà điều hành OrderBy sau khi một biệt, giống như trong định nghĩa queryB sau:

var queryB = 
    (from o in db.Orders 
    select o.Employee.LastName) 
    .Distinct().OrderBy(n => n); 

Chúc mừng mã hóa.

+1

Tôi hơi bối rối bởi (n => n) ... nhưng nó hoạt động! – KeelRisk

+1

@KeelRisk 'OrderBy' cần một cái gì đó vì không có' OrderBy() 'quá tải (trong đó, nếu nó tồn tại, sẽ được định nghĩa theo cùng một cách). Tôi đoán trường hợp của 'OrderByYeSelf' không được xác định là đủ đặc biệt ;-) –

0

Tôi gặp vấn đề tương tự trong khi sắp xếp năm từ bảng giao dịch.

thử này

var results = (from stats in db.t_harvest_statistics 
         select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList(); 

sau khi nhận được giá trị riêng biệt sử dụng phương pháp orderby

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