Füllen eines DataSets oder einer DataTable aus einem LINQ-Abfrageergebnissatz
-
08-06-2019 - |
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?
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>();