Điều này phụ thuộc nhiều vào nhà cung cấp linq của bạn. Trên Linq2Objects, bạn có thể sử dụng mã nguồn nội bộ Distinct
, điều này khiến người ta cho rằng thứ tự ban đầu được giữ nguyên.
Tuy nhiên, đối với các nhà cung cấp khác giải quyết một số loại SQL chẳng hạn, đó không phải là trường hợp cần thiết, vì một câu lệnh ORDER BY
thường xuất hiện sau bất kỳ tổng hợp nào (chẳng hạn như Distinct
). Vì vậy, nếu mã của bạn là:
myArray.OrderBy(x => anothercol).GroupBy(x => y.mycol);
điều này được dịch sang một cái gì đó tương tự như sau trong SQL:
SELECT * FROM mytable GROUP BY mycol ORDER BY anothercol;
Điều này rõ ràng đầu tiên sẽ nhóm dữ liệu của bạn và sắp xếp nó sau đó. Bây giờ bạn đang bị mắc kẹt với logic riêng của DBMS về cách thực thi điều đó. Trên một số DBMS, điều này thậm chí không được phép. Hãy tưởng tượng dữ liệu sau:
mycol anothercol
1 2
1 1
1 3
2 1
2 3
khi thực hiện myArr.OrderBy(x => x.anothercol).GroupBy(x => x.mycol)
chúng tôi giả sử kết quả sau:
mycol anothercol
1 1
2 1
Nhưng DBMS có thể tổng hợp một cột khác để luôn sử dụng giá trị của hàng đầu tiên, dẫn đến dữ liệu sau:
mycol anothercol
1 2
2 1
mà sau khi đặt hàng sẽ dẫn đến điều này:
mycol anothercol
2 1
1 2
Điều này tương tự như sau:
SELECT mycol, First(anothercol) from mytable group by mycol order by anothercol;
đó là thứ tự hoàn toàn ngược lại so với những gì bạn mong đợi.
Bạn thấy kế hoạch thực hiện có thể khác nhau tùy thuộc vào nhà cung cấp cơ bản là gì. Đây là lý do tại sao không có gì đảm bảo về điều đó trong tài liệu.