Truy vấn DataColumnColumn với LINQ


76

Tôi đang cố thực hiện một truy vấn LINQ đơn giản trên thuộc tính Cột của DataTable:

from c in myDataTable.Columns.AsQueryable()
    select c.ColumnName

Tuy nhiên, những gì tôi nhận được là:

Không thể tìm thấy triển khai mẫu truy vấn cho loại nguồn 'System.Linq.IQueryable'. 'Chọn' không tìm thấy. Hãy xem xét việc chỉ định rõ ràng kiểu của biến phạm vi 'c'.

Làm cách nào tôi có thể tải DataColumnCollection để chơi tốt với LINQ?

Câu trả lời:


130

Làm thế nào về:

var x = from c in dt.Columns.Cast<DataColumn>()
        select c.ColumnName;

3
@Dave: Điều gì gây ra vấn đề này ngay từ đầu? Tại sao chúng ta phải thực hiện Cast ()?
Ryan Shripat

24
Đó là vì dt.Columns là một IEnumerable, nhưng không phải là IEnumerable <DataColumn>. Nó chỉ là một chức năng của thực tế là lớp cũ hơn một chút và không triển khai kiểu chung mới. Khi bạn Truyền <> (), bạn truyền tới một IEnumerable <T> nơi các phương thức mở rộng được xác định.
Dave Markle

15

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

var x = from DataColumn c in myDataTable.Columns
        select c.ColumnName

Nó sẽ hoạt động hiệu quả giống như mã của Dave: "trong một biểu thức truy vấn, một biến lặp được nhập rõ ràng sẽ chuyển thành một lệnh gọi Cast (IEnumerable)", theo Enumerable.Cast<TResult> Methodbài báo của MSDN.


8

Với Cú pháp Phương thức Linq:

var x = myDataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.