2009-10-20 36 views
8

Ví dụ mã sau đây được mượn từ MSDN here. Tôi không nhận được query.CopyToDataTable() có sẵn trong mã của tôi. (xem dòng nhận xét trong mã sau của tôi).Tại sao tôi không nhận được .CopyToDataTable() trong LINQ Query()

public static bool SetPhysicianAsNotonServer(DataTable dt) 
     { 
      DataTable dtPhysicianServer = dt; 
      DataTable dtPhysicianClient = GetPhysicianClient(); 

      var query = 
       from SPhysician in dtPhysicianServer.AsEnumerable() 
       join CPhysician in dtPhysicianClient.AsEnumerable() 
       on SPhysician.Field<string>("PhysicianNumber") equals 
        CPhysician.Field<string>("PhysicianNumber") 
       select new 
       { 
        PhysicianNumber = CPhysician.Field<string>("PhysicianNumber") 
       }; 

      DataTable FilterDt = query; //query.CopyToDataTable(); 
      //YET TO DO CODE HERE 
      return true; 
     } 
+0

Nếu bạn cố gắng gọi 'CopyToDataTable() ' thông báo lỗi gì bạn nhận được? –

Trả lời

20

Câu lệnh chọn của bạn trả về một chuỗi các chuỗi (IEnumerable<string> hoặc IQueryable<string>), không phải là một chuỗi các DataRows. CopyToDataTable() chỉ có sẵn trên IEnumerable<T> trong đó T là hoặc có nguồn gốc từ DataRow.

Thay vì select new { ... } - mà chỉ sẽ giúp bạn có một chuỗi mới của loại đó, hãy thử:

select CPhysician; 

nào nên trả lại chuỗi mong muốn của hàng CPhysician.

Chỉnh sửa Nếu bạn muốn chuyển đổi T có nguồn gốc không thể datatable thành datatable, MSDN có lớp mẫu phản ánh bất kỳ loại nào và thực hiện chuyển đổi.

http://msdn.microsoft.com/en-us/library/bb669096.aspx

+0

@anonymous tại sao DV? –

+1

+1 cho giải thích hoàn chỉnh và chính xác duy nhất (trong khi có thể cần tham khảo DataSetExtensions, điều đó sẽ không khắc phục được sự cố). –

+0

Điều đó nghe có vẻ ổn. Nhưng hãy cho tôi biết làm thế nào tôi sẽ có được cố định này.Nếu tôi thực hiện điều này, truy vấn IEnumerable = // toàn bộ mã trên, Nó không cho phép tôi đặt Tham gia vào Truy vấn LINQ. – Jango

5

Bạn tồn tại trong không gian tên cụ thể?

System.Data.DataTableExtensions.CopyToDataTable() 

Cũng xác nhận việc bổ sung các tài liệu tham khảo này

System.Data.DataSetExtensions 
+1

DataTable.AsEnumerable cũng sẽ thất bại nếu điều này không được bao gồm. –

+1

đây là câu trả lời đúng – Abra001

2

Bạn cần phải tham khảo lắp ráp System.Data.DataSetExtensions và sử dụng không gian tên System.Data.

+0

Nó không phải là một vấn đề tham khảo. Tập hợp DataSetExtensions đã có sẵn. – Jango

0

Bạn đã tham chiếu assembly System.Data.DataSetExtensions? Phương pháp mở rộng này được định nghĩa ở đó.

0

Duyệt thêm vào MSDN trực tuyến mang lại cho tôi vào trang này: http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

Nó nói nó trong không gian tên System.Data (sử dụng System.Data) và bạn cần phải tham khảo các System.Data.DataSetExtensions.dll.

+0

Nếu đó là vấn đề, sau đó các cuộc gọi đến AsEnumerable sẽ thất bại, phải không? –

+0

Tôi đoán bạn nói đúng. Tôi chỉ làm một ít nghiên cứu và không có VS để kiểm tra ... Và tôi thấy rằng @Rex M có thể có câu trả lời đúng cho câu hỏi này :-) –

3

Tôi nghĩ đó là do bạn tạo loại ẩn danh để giữ đối tượng Field. Hãy thử điều này:

var query = from SPhysician in dtPhysicianServer.AsEnumerable() 
       join CPhysician in dtPhysicianClient.AsEnumerable() 
       on SPhysician.Field<string>("PhysicianNumber") equals 
        CPhysician.Field<string>("PhysicianNumber") 
       select CPhysician; 

    DataTable FilterDt = query.CopyToDataTable(); 

Định nghĩa của CopyToDataTable<T>:

public static DataTable CopyToDataTable<T>(
    this IEnumerable<T> source 
) 
where T : DataRow 

Vì vậy, những gì bạn chọn với các truy vấn phải là kiểu IEnumerable<T> nơi T kéo dài DataRow

+0

không có tác dụng. Cùng một điều ... Tôi không thể nhìn thấy .CopyToDataTable() – Jango

+0

Bạn đã thử tham khảo DataSetExtensions như những người khác đã đề cập? –

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