2009-05-26 34 views

Trả lời

51

Bạn có thể sử dụng LINQ:

return Enumerable.Range(0, reader.FieldCount) 
       .ToDictionary(reader.GetName, reader.GetValue); 
+0

Câu trả lời của bạn trông thú vị, nhưng tôi cần nó trong VB.NET, và tôi không biết làm thế nào để dịch phần cuối - .ToDictionary (reader.GetName, reader.GetValue). Bất kỳ sugegstion? Cảm ơn – bzamfir

+1

@ bzamfir: Bạn cần 'AddressOf'. – SLaks

+5

Tôi cảnh giác với việc nhảy trên bandwagon linq-là-tất cả mọi thứ nhưng điều này là lộng lẫy. –

24

Dễ dàng hơn này ?:

// Need to read the row in, usually in a while (opReader.Read) {} loop... 
opReader.Read(); 

// Convert current row into a dictionary 
Dictionary<string, object> dict = new Dictionary<string, object>(); 
for(int lp = 0 ; lp < opReader.FieldCount ; lp++) { 
    dict.Add(opReader.GetName(lp), opReader.GetValue(lp)); 
} 

Tôi vẫn không chắc chắn lý do tại sao bạn sẽ cần chuyển đổi đặc biệt này từ một loại bộ sưu tập khác.

+4

Như một câu trả lời cho câu hỏi của bạn: nếu người ta cần để cache kết quả, có vẻ như khôn ngoan hơn để bộ nhớ cache sao chép từ điển. Nếu không, bạn kết thúc với nhiều độc giả mở – Toad

+1

@Toad Một người dùng có thể sử dụng một DataTable nếu bạn muốn lưu trữ kết quả. 'MyDataTable.Load (dr);' –

+0

@CadeRoux một DataTable sẽ đọc toàn bộ tập kết quả thay vì một hàng duy nhất không? –

0

Phương thức GetValues ​​chấp nhận & đặt vào, tất cả các giá trị trong mảng 1D.
Điều đó có hữu ích không?

1

Đã là IDataRecord.

Điều đó sẽ cung cấp cho bạn chỉ về cùng một truy cập (bằng khóa) làm từ điển. Vì các hàng thường không có nhiều hơn một vài cột, hiệu suất của các tra cứu không nên khác nhau. Sự khác biệt quan trọng duy nhất là loại "tải trọng", và thậm chí ở đó từ điển của bạn sẽ phải sử dụng đối tượng cho kiểu giá trị, vì vậy tôi đưa ra cạnh cho IDataRecord.

+6

Điều này rất hữu ích khi bạn muốn kết quả của truy vấn có sẵn sau khi bạn đã giải phóng kết nối. Các đối tượng DataReader về bản chất được gắn với kết nối mà chúng được tạo ra. – sholsinger

2

Tôi đã xem qua câu hỏi này trên 2016/03/09 và kết thúc bằng câu trả lời cung cấp bởi SLaks. Tuy nhiên, tôi cần một chút thay đổi nó để:

dataRowDictionary = Enumerable.Range(0, reader.FieldCount).ToDictionary(i => reader.GetName(i), i=> reader.GetValue(i).ToString()); 

tôi thấy hướng dẫn từ câu hỏi này StackOverflow: convert dataReader to Dictionary

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