Het vullen van een DataSet of DataTable uit een LINQ queryresultaatset

stemmen
109

Hoe maak je een LINQ query als een ASMX webservice bloot? Meestal uit het bedrijfsleven tier, ik kan een getypte terugkeren DataSetof DataTabledie kunnen worden geserialiseerd voor transport over ASMX.

Hoe kan ik hetzelfde doen voor een LINQ query? Is er een manier om een getypte bevolken DataSetof DataTablevia een LINQ query?

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 ik de set van een LINQ query in een resultaat DataSetof DataTable? Als alternatief is de LINQ query serializeable zodat ik het kan ontmaskeren als een ASMX web service?

De vraag is gesteld op 01/08/2008 om 05:59
bron van user
In andere talen...                            


7 antwoorden

stemmen
15

Als u een terugkeer type te gebruiken IEnumerable, kunt u uw terugkeren vraag variabele direct.

antwoordde op 01/08/2008 om 15:10
bron van user

stemmen
10

Maak een klasse object en terug te keren een list(T)van de query.

antwoordde op 08/08/2008 om 13:17
bron van user

stemmen
76

Zoals in de vraag, IEnumerableheeft een CopyToDataTablemethode:

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

Waarom wordt dat het werk voor u?

antwoordde op 15/08/2008 om 17:27
bron van user

stemmen
21

Maak een set van Data Transfer Objects, een paar van de kaartenmakers, en terug te keren dat via de ASMX.
Je moet nooit de database-objecten direct bloot te leggen, zoals een wijziging van de procedure schema zal doorgeven aan de webservice consument, zonder dat u het merkt.

antwoordde op 15/08/2008 om 17:42
bron van user

stemmen
24

Om deze vraag tegen een uit te voeren DataContextklasse, moet u het volgende 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>();

Zonder as IEnumerable<DataRow>;u de volgende compilatie fout te zien:

Kan niet impliciet converteren type 'System.Collections.Generic.IEnumerable' naar 'System.Collections.Generic.IEnumerable'. Een expliciete conversie bestaat (mist u een cast?)

antwoordde op 13/02/2009 om 01:10
bron van user

stemmen
3

Als u gebruik maken van de return type van IEnumerable.Het helpt direct het rendement van uw queryvariabele.

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>();
antwoordde op 11/04/2018 om 11:55
bron van user

stemmen
0

Voor de volledigheid zijn deze oplossingen niet voor EF Core (althans niet te EF Core 2.2). Casting om IEnumerable<DataRow>, zoals voorgesteld in de andere antwoorden hier, mislukt. De uitvoering van deze klasse en uitbreiding methoden werkte voor mij https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .

Waarom niet in EF Core is gebouwd, ik heb geen idee.

antwoordde op 20/06/2019 om 23:14
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more