c# - Füllen eines DataSet oder einer DataTable aus einer LINQ-Abfrage-Ergebnismenge

Translate

Wie macht man eine LINQ-Abfrage als ASMX-Webdienst verfügbar? Normalerweise kann ich von der Business-Ebene einen getippten zurückgebenDataSetoderDataTabledie für den Transport über ASMX serialisiert werden kann.

Wie kann ich dasselbe für eine LINQ-Abfrage tun? Gibt es eine Möglichkeit, eine Eingabe zu füllenDataSetoderDataTableü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 die Ergebnismenge einer LINQ-Abfrage in eineDataSetoderDataTable? Ist die LINQ-Abfrage alternativ serialisierbar, damit ich sie als ASMX-Webdienst verfügbar machen kann?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Wie in der Frage erwähnt,IEnumerablehat einCopyToDataTableMethode:

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 funktioniert das bei Ihnen nicht?

Quelle
Sam Lee
Translate

So führen Sie diese Abfrage für a durchDataContextKlasse 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 dasas IEnumerable<DataRow>;Sie sehen den folgenden Kompilierungsfehler:

Typ 'System.Collections.Generic.IEnumerable' kann nicht implizit in 'System.Collections.Generic.IEnumerable' konvertiert werden. Es gibt eine explizite Konvertierung (fehlt Ihnen eine Besetzung?)

Quelle
Translate

Erstellen Sie eine Reihe von Datenübertragungsobjekten, einige Mapper, und geben Sie diese über die .asmx-Datei zurück.
Du solltestnoch nieStellen Sie die Datenbankobjekte direkt bereit, da eine Änderung des Prozedurschemas an den Webdienstkonsumenten weitergegeben wird, ohne dass Sie dies bemerken.

Quelle
Translate

Wenn Sie einen Rückgabetyp von verwendenIEnumerablekönnen Sie Ihre zurückgebenAbfragedirekt variabel.

Quelle
Translate

Erstellen Sie ein Klassenobjekt und geben Sie a zurücklist(T)der Abfrage.

Quelle
Translate

Wenn Sie den Rückgabetyp von verwendenIEnumerableEs hilft, Ihre Abfragevariable direkt zurückzugeben.

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

Der Vollständigkeit halber funktionieren diese Lösungen nicht für EF Core (zumindest nicht für EF Core 2.2). Casting zuIEnumerable<DataRow>, wie in den anderen Antworten hier vorgeschlagen, schlägt fehl. Die Implementierung dieser Klassen- und Erweiterungsmethoden hat bei mir funktionierthttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.

Warum es nicht in EF Core eingebaut ist, weiß ich nicht.

Quelle