Wie macht man eine LINQ-Abfrage als ASMX-Webdienst verfügbar? Normalerweise kann ich auf der Business-Ebene eine Eingabe zurückgeben DataSet
oder DataTable
diese für den Transport über ASMX serialisieren.
Wie kann ich dasselbe für eine LINQ-Abfrage tun? Gibt es eine Möglichkeit, eine Eingabe zu füllenDataSet
oder DataTable
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 ein DataSet
oder bekommen?DataTable
? Ist die LINQ-Abfrage alternativ serialisierbar, damit ich sie als ASMX-Webdienst verfügbar machen kann?
c#
linq
web-services
.net-3.5
Geoff Dalgas
quelle
quelle
Um diese Abfrage für eine
DataContext
Klasse durchzuführen , müssen Sie Folgendes tun:Ohne das
as IEnumerable<DataRow>;
wird der folgende Kompilierungsfehler angezeigt:quelle
Erstellen Sie eine Reihe von Datenübertragungsobjekten, einige Mapper, und geben Sie diese über die .asmx-Datei zurück.
Sie sollten die Datenbankobjekte niemals direkt verfügbar machen, da eine Änderung des Prozedurschemas an den Webdienstkonsumenten weitergegeben wird, ohne dass Sie dies bemerken.
quelle
Wenn Sie einen Rückgabetyp von verwenden
IEnumerable
, können Sie Ihre Abfragevariable direkt zurückgeben.quelle
Erstellen Sie ein Klassenobjekt und geben Sie eine
list(T)
der Abfragen zurück.quelle
Wenn Sie
IEnumerable
als Rückgabetyp verwenden, wird Ihre Abfragevariable direkt zurückgegeben.quelle
Der Vollständigkeit halber funktionieren diese Lösungen nicht für EF Core (zumindest nicht für EF Core 2.2). Das Casting auf
IEnumerable<DataRow>
schlägt fehl, wie in den anderen Antworten hier vorgeschlagen. Die Implementierung dieser Klassen- und Erweiterungsmethoden funktionierte für mich unter https://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