Frage

Wie stellen Sie eine LINQ-Abfrage als ASMX-Webdienst bereit?Normalerweise kann ich auf der Business-Stufe eine getippte Nachricht zurücksenden DataSet oder DataTable die 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 eingegebene Datei zu füllen? DataSet oder 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 die Ergebnismenge einer LINQ-Abfrage in eine DataSet oder DataTable?Ist die LINQ-Abfrage alternativ serialisierbar, sodass ich sie als ASMX-Webdienst verfügbar machen kann?

War es hilfreich?

Lösung

Wie in der Frage erwähnt, IEnumerable hat ein 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 bei Ihnen nicht?

Andere Tipps

Um diese Abfrage für a durchzuführen DataContext Klasse 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 das as IEnumerable<DataRow>; Sie werden den folgenden Kompilierungsfehler sehen:

Der Typ „System.Collections.Generic.IEnumerable“ kann nicht implizit in „System.Collections.Generic.IEnumerable“ konvertiert werden.Es liegt eine explizite Konvertierung vor (fehlt Ihnen eine Besetzung?)

Erstellen Sie einen Satz Datenübertragungsobjekte und ein paar Mapper und geben Sie diese über die .asmx-Datei zurück.
Du solltest niemals Machen Sie die Datenbankobjekte direkt verfügbar, da eine Änderung im Prozedurschema an den Webdienst-Konsumenten weitergegeben wird, ohne dass Sie es bemerken.

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

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

Wenn Sie den Rückgabetyp von verwenden IEnumerable.Es 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>();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top