การกรอก DataSet หรือ DataTable จากชุดผลลัพธ์การสืบค้น LINQ


137

คุณแสดงแบบสอบถาม LINQ เป็นบริการเว็บ ASMX ได้อย่างไร โดยปกติแล้วจากระดับธุรกิจฉันสามารถส่งคืนพิมพ์ที่พิมพ์DataSetหรือDataTableที่สามารถต่ออนุกรมสำหรับการขนส่งผ่าน ASMX ได้

ฉันจะทำเช่นเดียวกันกับแบบสอบถาม LINQ ได้อย่างไร มีวิธีเติมข้อมูลที่พิมพ์DataSetหรือDataTableผ่านแบบสอบถาม LINQ หรือไม่?

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;
}

ฉันจะรับชุดผลลัพธ์ของแบบสอบถาม LINQ เป็นDataSetหรือDataTable? หรืออีกวิธีหนึ่งคือแบบสอบถาม LINQ สามารถทำให้เป็นอนุกรมได้เพื่อให้ฉันสามารถแสดงเป็นบริการเว็บ ASMX ได้หรือไม่

คำตอบ:


87

ดังที่กล่าวไว้ในคำถามIEnumerableมี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>();

ทำไมมันถึงไม่เหมาะกับคุณล่ะ?


29
สำหรับทุกคนที่สงสัยว่าทำไม CopyToDataTable () ไม่ทำงานบนเครื่องของพวกเขา: ฟังก์ชันนี้ไม่ได้เป็นส่วนหนึ่งของ. NET 3.5 SP1 และจะเป็น. NET 4.0; มันถูก จำกัด ไว้ที่ IEnumerable <DataRows> และไม่ทำงานสำหรับ IEnumerable <T> - bit.ly/dL0G5
คำขวัญ

26

ในการดำเนินการสอบถามนี้กับDataContextชั้นเรียนคุณจะต้องดำเนินการดังต่อไปนี้:

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

หากไม่มีas IEnumerable<DataRow>;คุณจะเห็นข้อผิดพลาดในการคอมไพล์ต่อไปนี้:

ไม่สามารถแปลงประเภท 'System.Collections.Generic.IEnumerable' เป็น 'System.Collections.Generic.IEnumerable' โดยปริยาย มีการแปลงที่ชัดเจน (คุณไม่มีนักแสดงหรือไม่)


22

สร้างชุดของออบเจ็กต์การถ่ายโอนข้อมูลตัวทำแผนที่สองตัวและส่งคืนผ่านทาง. asmx
คุณไม่ควรเปิดเผยอ็อบเจ็กต์ฐานข้อมูลโดยตรงเนื่องจากการเปลี่ยนแปลงในสคีมาของโพรซีเดอร์จะเผยแพร่ไปยังผู้ใช้บริการเว็บโดยที่คุณไม่สังเกตเห็น




2

หากคุณใช้IEnumerableเป็นประเภทการส่งคืนจะส่งคืนตัวแปรการสืบค้นของคุณโดยตรง

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

เพื่อความสมบูรณ์โซลูชันเหล่านี้ใช้ไม่ได้กับ EF Core (อย่างน้อยก็ไม่ใช่สำหรับ EF Core 2.2) การส่งไปยังIEnumerable<DataRow>ตามที่แนะนำในคำตอบอื่น ๆ ที่นี่ล้มเหลว การดำเนินการเรียนและส่วนขยายนี้วิธีการทำงานให้ฉันhttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow

เหตุใดจึงไม่ได้ติดตั้งไว้ใน EF Core ฉันไม่รู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.