2008-08-01 37 views
106

Làm cách nào để hiển thị truy vấn LINQ dưới dạng dịch vụ web ASMX? Thông thường, từ tầng nghiệp vụ, tôi có thể trả về một số đã nhập DataSet hoặc DataTable có thể được tuần tự hóa để vận chuyển qua ASMX.Điền một DataSet hoặc DataTable từ một tập hợp kết quả truy vấn LINQ

Làm cách nào để tôi có thể thực hiện tương tự cho truy vấn LINQ? Có cách nào để điền một số DataSet hoặc DataTable đã nhập qua truy vấn LINQ không?

public static MyDataTable CallMySproc() 
{ 
    string conn = "..."; 

    MyDatabaseDataContext db = new MyDatabaseDataContext(conn); 
    MyDataTable dt = new MyDataTable(); 

    // execute a sproc via LINQ 
    var query = from dr 
       in db.MySproc().AsEnumerable 
       select dr; 

    // copy LINQ query resultset into a DataTable -this does not work !  
    dt = query.CopyToDataTable(); 

    return dt; 
} 

Làm thế nào tôi có thể nhận được tập kết quả của một truy vấn LINQ vào một DataSet hoặc DataTable? Ngoài ra, truy vấn LINQ có thể nối tiếp để tôi có thể hiển thị nó dưới dạng dịch vụ web ASMX không?

Trả lời

73

Như đã đề cập trong câu hỏi, IEnumerable có một phương pháp CopyToDataTable:

IEnumerable<DataRow> query = 
    from order in orders.AsEnumerable() 
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1) 
    select order; 

// Create a table from the query. 
DataTable boundTable = query.CopyToDataTable<DataRow>(); 

Tại sao sẽ không phải là công việc cho bạn?

+28

Để mọi người tự hỏi tại sao CopyToDataTable() không hoạt động trên máy của họ: Chức năng này không phải là một phần của .NET 3.5 SP1 cũng không phải của .NET 4.0; nó đã bị hạn chế đối với IEnumerable và không hoạt động đối với IEnumerable - http://bit.ly/dL0G5 – motto

13

Nếu bạn sử dụng loại trả lại là IEnumerable, bạn có thể trả lại trực tiếp truy vấn biến của mình.

7

Tạo đối tượng lớp và trả lại một truy vấn list(T).

18

Tạo một nhóm đối tượng chuyển dữ liệu, một vài người lập bản đồ và trả về thông qua .asmx.
Bạn nên không bao giờ hiển thị trực tiếp các đối tượng cơ sở dữ liệu, vì thay đổi trong lược đồ thủ tục sẽ lan truyền tới người tiêu dùng dịch vụ web mà bạn không nhận thấy nó.

22

Thực hiện truy vấn này chống lại một lớp DataContext, bạn sẽ cần phải làm như sau:

MyDataContext db = new MyDataContext(); 
IEnumerable<DataRow> query = 
    (from order in db.Orders.AsEnumerable() 
     select new 
     { 
      order.Property, 
      order.Property2 
     }) 
    as IEnumerable<DataRow>; 
return query.CopyToDataTable<DataRow>(); 

Nếu không có sự as IEnumerable<DataRow>; bạn sẽ thấy những lỗi biên dịch sau:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

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