Füllen eines DataSet oder Datatable aus einer LINQ-Abfrageergebnis

stimmen
109

Wie setzen Sie eine LINQ - Abfrage als ASMX Web - Service? In der Regel von der Business - Tier, kann ich eine typisierte zurückkehren DataSetoder DataTabledie für den Transport über ASMX serialisiert werden kann.

Wie kann ich das Gleiche tun für eine LINQ - Abfrage? Gibt es eine Möglichkeit , eine typisierte zu füllen DataSetoder DataTableüber eine LINQ - Abfrage?

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

Wie kann ich das Ergebnis Set einer LINQ - Abfrage in einem bekommen DataSetoder DataTable? Alternativ ist der LINQ - Abfrage serializeable so , dass ich es als ASMX Web - Service kann aussetzen?

Veröffentlicht am 01/08/2008 um 05:59
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
76

Wie in der Frage erwähnt, IEnumerablehat eine 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>();

Warum wird für Dich nicht, dass die Arbeit?

Beantwortet am 15/08/2008 um 17:27
quelle vom benutzer

stimmen
24

Um diese Abfrage für eine ausführen DataContextKlasse, müssen Sie Folgendes tun:

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

Ohne die as IEnumerable<DataRow>;wird die folgende Zusammenstellung Fehler anzeigen:

Kann nicht implizit Typ ‚System.Collections.Generic.IEnumerable‘ auf ‚System.Collections.Generic.IEnumerable‘ konvertieren. Eine explizite Konvertierung vorhanden ist (sind Sie nicht eine Besetzung?)

Beantwortet am 13/02/2009 um 01:10
quelle vom benutzer

stimmen
21

Machen Sie eine Reihe von Datenübertragung Objekte, ein paar Mapper, und zurück , dass über die .asmx.
Sie sollten nie die Datenbank - Objekte direkt aus, da eine Änderung des Verfahrens Schema an den Web - Service - Consumer propagieren, ohne dass Sie es merken.

Beantwortet am 15/08/2008 um 17:42
quelle vom benutzer

stimmen
15

Wenn Sie einen Rückgabetyp verwenden IEnumerable, können Sie Ihre Rückkehr Abfrage Variable direkt.

Beantwortet am 01/08/2008 um 15:10
quelle vom benutzer

stimmen
10

Erstellen Sie ein Klasse - Objekt und zurück eine list(T)der Abfrage.

Beantwortet am 08/08/2008 um 13:17
quelle vom benutzer

stimmen
3

Wenn Sie den Rückgabetyp verwenden IEnumerable.Es hilft direkt Ihre Anfrage Variable zurück.

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>();
Beantwortet am 11/04/2018 um 11:55
quelle vom benutzer

stimmen
0

Aus Gründen der Vollständigkeit, funktionieren diese Lösungen nicht für EF Core (zumindest nicht für EF - Core 2.2). Gießen IEnumerable<DataRow>, wie hier in den anderen Antworten vorgeschlagen, schlägt fehl. Die Implementierung dieser Klasse und Erweiterungsmethoden für mich gearbeitet https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .

Warum ist es nicht in EF Kern gebaut, habe ich keine Ahnung.

Beantwortet am 20/06/2019 um 23:14
quelle vom benutzer

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