Frage

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

Wie kann ich das gleiche für eine LINQ-Abfrage zu tun? Gibt es eine Möglichkeit, eine typisierte DataSet oder DataTable über eine LINQ-Abfrage zu fü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 einem DataSet oder DataTable bekommen? Alternativ ist die LINQ-Abfrage serializable so, dass ich es als ASMX Web-Service aussetzen kann?

War es hilfreich?

Lösung

Wie in der Frage erwähnt, IEnumerable hat 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 wird nicht, dass die Arbeit für Sie?

Andere Tipps

Um diese Abfrage für eine DataContext Klasse durchfü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 die as IEnumerable<DataRow>; erhalten Sie die folgende Zusammenstellung Fehlermeldung angezeigt:

  

Kann nicht implizit Typ ‚System.Collections.Generic.IEnumerable‘ auf ‚System.Collections.Generic.IEnumerable‘ konvertieren. Eine explizite Konvertierung vorhanden ist (möglicherweise fehlt eine Guss?)

Erstellen Sie eine Reihe von Data Transfer Objects, ein paar Mapper, und zurück, dass über die .asmx.
Sie sollten nie entlarven die Datenbank-Objekte direkt als Änderung des Verfahrens Schema an den Web-Service-Consumer propagieren, ohne dass Sie es merken.

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

Erstellen Sie eine Klasse-Objekt und gibt eine list(T) der Abfrage.

Wenn Sie den Rückgabetyp IEnumerable.It verwenden hilft Rückkehr Ihrer Anfrage Variable direkt an.

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