Füllen eines DataSet oder einer DataTable aus einer LINQ-Abfrageergebnismenge

  • Wie stellen Sie eine LINQ-Abfrage als ASMX-Webdienst bereit? Normalerweise kann ich vom Business-Tier ein typisiertes DataSet oder DataTable zurückgeben, das für den Transport über ASMX serialisiert werden kann.

    Wie kann ich dasselbe für LINQ tun? Abfrage? Gibt es eine Möglichkeit, ein typisiertes DataSet oder DataTable über eine LINQ-Abfrage auszufüllen?

     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 DataSet oder DataTable bekommen? Ist alternativ die LINQ-Abfrage serialisierbar, sodass ich sie als ASMX-Webdienst verfügbar machen kann?

    30 November 2016
    Nhan
6 answers
  • Wie in der Frage erwähnt, verfügt IEnumerable über eine CopyToDataTable -Methode:

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

    04 May 2012
    mattytommoSkooz
  • Um diese Abfrage für eine Klasse DataContext durchzuführen, 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 as IEnumerable<DataRow>; wird der folgende Kompilierungsfehler angezeigt:

    Der Typ 'System.Collections.Generic.IEnumerable' kann nicht implizit konvertiert werden. zu "System.Collections.Generic.IEnumerable". Es existiert eine explizite Konvertierung (fehlt eine Besetzung?)

    17 December 2013
    C1pherDmitry Makovetskiyd
  • Erstellen Sie eine Gruppe von Datenübertragungsobjekten, einige Mapper, und geben Sie diese über die .asmx-Datei zurück.
    Sie sollten die Datenbankobjekte niemals direkt verfügbar machen. Eine Änderung im Prozedurschema wird an den Webservice-Consumer weitergegeben, ohne dass Sie es bemerken.

    15 August 2008
    Lars Mæhlum
  • Wenn Sie den Rückgabetyp IEnumerable verwenden, können Sie Ihre Variable query direkt zurückgeben.

    18 October 2008
    Kilhoffer
  • Erstellen Sie ein Klassenobjekt und geben Sie list(T) der Abfrage zurück.

    14 October 2012
    Paul FlemingChris
  • Wenn Sie den Rückgabetyp von IEnumerable verwenden, wird die Abfragevariable direkt zurückgegeben.

     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>();
     
    11 April 2018
    Vijay SKernelPanik