Điền vào một Bộ dữ liệu hoặc DataTable từ tập kết quả truy vấn LINQ


137

Làm thế nào để bạn hiển thị một truy vấn LINQ như một dịch vụ web ASMX? Thông thường, từ tầng doanh nghiệp, tôi có thể trả lại một kiểu đánh máy DataSethoặc DataTablecó thể được tuần tự hóa để vận chuyển qua ASMX.

Làm thế nào tôi có thể làm tương tự cho một truy vấn LINQ? Có cách nào để nhập dữ liệu đánh máy DataSethoặc DataTablethông 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 cách nào tôi có thể lấy tập kết quả của truy vấn LINQ thành một DataSethoặc DataTable? Ngoài ra, truy vấn LINQ có được tuần tự hóa để tôi có thể hiển thị nó dưới dạng dịch vụ web ASMX không?

Câu trả lời:


87

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

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 điều đó không làm việc cho bạn?


29
Để 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 và cũng không phải là .NET 4.0; nó đã bị giới hạn ở IEnumerable <DataRows> và không hoạt động cho IEnumerable <T> - bit.ly/dL0G5
phương châm

26

Để thực hiện truy vấn này đối với một DataContextlớp, bạn sẽ cần 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ó as IEnumerable<DataRow>;bạn sẽ thấy lỗi biên dịch sau:

Không thể chuyển đổi hoàn toàn loại 'System.Collections.Generic.IEnumerable' thành 'System.Collections.Generic.IEnumerable'. Một chuyển đổi rõ ràng tồn tại (bạn đang thiếu một diễn viên?)


22

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


15

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



2

Nếu bạn sử dụng IEnumerablelàm kiểu trả về, nó sẽ trả về biến truy vấn của bạn trực tiếp.

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>();

0

Để hoàn thiện, các giải pháp này không hoạt động đối với EF Core (ít nhất là không dành cho EF Core 2.2). Đúc đến IEnumerable<DataRow>, như được đề xuất trong các câu trả lời khác ở đây, thất bại. Việc triển khai lớp này và các phương thức mở rộng đã có hiệu quả đối với tôi https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/im vây-copytodatitable-where-type-not-a-datarow .

Tại sao nó không được tích hợp vào EF Core, tôi không biết.

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.