Câu hỏi của tôi là liên quan đến tình trạng SQL kết nối, tải, vv dựa trên đoạn mã sau:Có bất kỳ cạm bẫy nào khi sử dụng loại trả về <T> của IEnumerable cho dữ liệu SQL không?
public IEnumberable<MyType> GetMyTypeObjects()
{
string cmdTxt = "select * from MyObjectTable";
using(SqlConnection conn = new SqlConnection(connString))
{
using(SqlCommand cmd = new SqlCommand(cmdTxt, conn))
{
conn.Open();
using(SqlDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
yield return Mapper.MapTo<MyType>(reader);
}
}
}
}
yield break;
}
tôi có thể thấy điều này có thể là một vấn đề nếu có nhiều tiến trình đang chạy mã tương tự với thời gian thực hiện dài giữa lặp của đối tượng IEnumerable, bởi vì các kết nối sẽ được mở lâu hơn, vv Tuy nhiên, nó cũng có vẻ hợp lý rằng điều này sẽ làm giảm việc sử dụng CPU trên máy chủ SQL bởi vì nó chỉ trả về dữ liệu khi đối tượng IEnumerable được sử dụng. Nó cũng làm giảm mức sử dụng bộ nhớ trên máy khách bởi vì máy khách chỉ phải nạp một thể hiện của MyType trong khi nó hoạt động thay vì tải tất cả các lần xuất hiện của MyType (bằng cách lặp qua toàn bộ DataReader và trả về một List hoặc một cái gì đó).
Có bất kỳ trường hợp bạn có thể nghĩ về nơi bạn sẽ không muốn sử dụng IEnumerable theo cách này, hoặc bất kỳ trường hợp bạn nghĩ rằng nó phù hợp một cách hoàn hảo?
Loại tải này thực hiện trên máy chủ SQL?
Đây có phải là thứ bạn sẽ sử dụng trong mã của riêng bạn (chặn bất kỳ đề cập nào về NHibernate, Subsonic, v.v ...) không?
-
Đó là một điểm tốt, cũng không xem xét điều đó. Tôi rất mù quáng theo cách tôi sẽ sử dụng nó! – scottm
@Guffa: Sử dụng các phương thức mở rộng như 'Take' sẽ không thành vấn đề: Phương thức' GetMyTypeObjects' chỉ là cú pháp tạo ra một đối tượng iterator 'IDisposable'. 'Take' sẽ gọi phương thức' Dispose' của trình lặp khi nó được thực hiện, và sau đó sẽ xử lý kết nối, lệnh, đầu đọc, v.v. – LukeH
@Guffa: Và điều tương tự cũng áp dụng cho bất kỳ phần đọc nào khác của resultset: miễn là bạn gọi 'Dispose' khi bạn đã hoàn thành (hoặc tốt hơn là chỉ bọc mọi thứ trong một khối' using') thì kết nối, lệnh, trình đọc vv cũng sẽ được xử lý. – LukeH