Vra

Hoe stel jy 'n LINQ-navraag bloot as 'n ASMX-webdiens?Gewoonlik, vanaf die besigheidsvlak, kan ek 'n getikte terugstuur DataSet of DataTable wat geserialiseer kan word vir vervoer oor ASMX.

Hoe kan ek dieselfde doen vir 'n LINQ-navraag?Is daar 'n manier om 'n getikte te vul DataSet of DataTable via 'n LINQ-navraag?

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

Hoe kan ek die resultaatstel van 'n LINQ-navraag in 'n DataSet of DataTable?Alternatiewelik, is die LINQ-navraag serialiseerbaar sodat ek dit as 'n ASMX-webdiens kan blootstel?

Was dit nuttig?

Oplossing

Soos genoem in die vraag, IEnumerable het 'n CopyToDataTable metode:

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

Hoekom sal dit nie vir jou werk nie?

Ander wenke

Om hierdie navraag uit te voer teen 'n DataContext klas, sal jy die volgende moet doen:

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

Sonder die as IEnumerable<DataRow>; jy sal die volgende samestellingsfout sien:

Kan nie implisiet tipe 'System.Collections.Generic.IEnumerable' na 'System.Collections.Generic.IEnumerable' omskakel nie.'n Eksplisiete omskakeling bestaan ​​(mis jy 'n rolverdeling?)

Maak 'n stel data-oordragvoorwerpe, 'n paar karteerders, en stuur dit terug via die .asmx.
Jy behoort nooit stel die databasisobjekte direk bloot, aangesien 'n verandering in die prosedureskema na die webdiensverbruiker sal voortplant sonder dat jy dit agterkom.

As jy 'n terugkeer tipe gebruik van IEnumerable, kan jy jou terugbesorg navraag veranderlik direk.

Skep 'n klasobjek en gee terug a list(T) van die navraag.

As jy die terugkeer tipe gebruik van IEnumerable.Dit help om jou navraagveranderlike direk terug te gee.

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>();
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top