2012-02-29 37 views
9

Tôi đã làm việc với một DataTable và nhận thấy rằng Resharper đề nghị rằng tôi có thể chuyển đổi một vòng lặp thành một biểu thức LINQ. Tôi đã làm như vậy và nó đã được viết lại bằng cú pháp biểu thức truy vấn (giản thể):LINQ - Phương pháp so sánh sai số truy vấn

var test1 = from DataRow row in dt.Rows select row; 

Cá nhân, tôi thích phương pháp cú pháp để viết lại nó như thế này:

var test2 = dt.Rows.Select(row => row); 

Và nó đã phá vỡ.

'System.Data.DataRowCollection' không chứa một định nghĩa cho 'Chọn' và không có phương pháp mở rộng 'Chọn' chấp nhận một cuộc tranh luận đầu tiên của loại 'System.Data.DataRowCollection' có thể được tìm thấy (là bạn thiếu sử dụng chỉ thị hoặc tham chiếu lắp ráp?)

Vì biểu thức truy vấn là translated to method calls, tại sao công trình đầu tiên lại không phải là thứ hai? Tôi mong đợi cả hai hoặc không làm việc mà rõ ràng không phải là trường hợp.

Trả lời

12

Đầu tiên có một biến phạm vi gõ một cách rõ ràng, vì vậy nó thực sự biên soạn để:

var test2 = dt.Rows.Cast<DataRow>(); 

(Không cần cho Select vì đây là một biểu hiện truy vấn thoái hóa (select là một không-op .)

một cách khác là để gọi AsEnumerable từ DataTableExtensions tôi tin rằng có thể có một số lợi ích hiệu suất trong đó, nhưng chỉ trong một số trường hợp:.

var test2 = dt.AsEnumerable(); 
+2

Điều này là cần thiết vì 'DataRowCollection' triển khai 'IEnumerable', không phải là' IEnumerable '. –

+1

@ChrisShouts: Ah, tôi đã nhận thấy điều này trước đây nhưng không bao giờ khá rõ ràng chính xác lý do tại sao. Thực tế nó thực hiện "sai" IEnumerable là những gì tôi đã mất tích. :) – Chris

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