Nó không phải là while
so với foreach
điều đó tạo ra sự khác biệt. Đó là lệnh gọi đến .Cast<T>()
.
Trong mẫu đầu tiên, bạn đang mang lại giống nhau đối tượng trong mỗi lần lặp của vòng lặp while. Nếu bạn không cẩn thận, bạn sẽ hoàn thành trình lặp lợi nhuận trước khi thực sự sử dụng dữ liệu và DataReader sẽ bị loại bỏ. Điều này có thể xảy ra nếu bạn gọi .ToList()
sau khi gọi phương thức này. Điều tốt nhất bạn có thể hy vọng là mọi bản ghi trong danh sách có cùng giá trị.
(Mẹo chuyên nghiệp:hầu hết thời gian bạn không muốn gọi .ToList()
cho đến khi bạn hoàn toàn phải làm. Tốt hơn là chỉ làm việc với các bản ghi IEnumerable).
Trong mẫu thứ hai, khi bạn gọi .Cast<T>()
trên datareader, bạn đang tạo một bản sao dữ liệu một cách hiệu quả khi nó lặp lại qua mỗi bản ghi. Bây giờ bạn không còn mang lại cùng một đối tượng nữa.