2012-07-24 32 views
15

Tôi đã sử dụng Dapper và với dự án hiện tại của mình, tôi sẽ phải sử dụng ADO.NET. Câu hỏi của tôi là làm thế nào để tôi trả về một IEnumerable bằng cách sử dụng ADO.NET? Đây là những gì tôi đã sử dụng Dapper. Ai đó có thể giúp tôi với chuyển đổi này để làm điều tương tự nhưng với ADO?Làm thế nào để trả về một IEnumerable <> bằng cách sử dụng ADO.NET?

public IEnumerable<Favorites> GetFavorites() 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(connString)) 
    { 
     sqlConnection.Open(); 
     var work = sqlConnection.Query<Favorites>("Select * from favorites"); 
     return work; 
    } 
} 
+0

Bạn có hài lòng khi làm việc với DataSets và DataRows cho các thực thể của mình (ví dụ: Yêu thích) hoặc bạn có cần lớp học được đánh máy mạnh không? – davenewza

+0

Chức năng ADO.NET chuẩn sẽ không ánh xạ các kết quả dữ liệu đến một đối tượng cho bạn. Bạn về cơ bản sẽ lấy lại một 'DataSet' từ truy vấn và sẽ phải xây dựng các đối tượng' Favorites' của bạn từ đó. – David

+3

Chỉ cần lặp lại qua các hàng 'DataSet',' yield'ing một đối tượng 'Favorite' mới cho mỗi một – paul

Trả lời

19

Bạn có thể sử dụng yield return như vậy:

public IEnumerable<Favorites> GetFavorites() 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(connString)) 
    { 
     sqlConnection.Open(); 
     using (SqlCommand cmd = sqlConnection.CreateCommand()) 
     { 
      cmd.CommandText = "Select * from favorites"; 
      cmd.CommandType = CommandType.Text; 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        // Create a Favorites instance 
        var favorites = new Favorites(); 
        favorites.Foo = reader["foo"]; 
        // ... etc ... 
        yield return favorites; 
       } 
      } 
     } 
    } 
} 

Rõ ràng, bạn có thể cấu trúc này bằng cách tạo một constructor Favorites chấp nhận một IDataReader hoặc SqlDataReader, hoặc tạo ra một phương pháp hữu ích để điền giá trị, hoặc bất cứ điều gì, nhưng đây là cấu trúc cơ bản.

0

Nếu bạn có thể thực hiện tất cả trong khối using, bạn có thể tận dụng LINQ và giao diện IEnumerable trên DbDataReader. Nó cung cấp ADO.NET thuần túy độc lập với một lượng nhỏ mã hợp lý.

var command = connection.CreateCommand(); 
command.CommandText = "select * from favorites"; 
using (var reader = command.ExecuteReader()) { 
    var work = from IDataRecord r in select ...; 
    ... use work ... 
} 
Các vấn đề liên quan