Comment exposez-vous une requête LINQ en tant que service Web ASMX? Habituellement, à partir du niveau métier, je peux renvoyer un fichier tapé DataSet
ou DataTable
qui peut être sérialisé pour le transport sur ASMX.
Comment puis-je faire de même pour une requête LINQ? Existe-t-il un moyen de remplir une requête tapée DataSet
ou DataTable
via une requête LINQ?
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;
}
Comment puis-je obtenir le jeu de résultats d'une requête LINQ dans un DataSet
ou DataTable
? Sinon, la requête LINQ est-elle sérialisable afin que je puisse l'exposer en tant que service Web ASMX?
c#
linq
web-services
.net-3.5
Geoff Dalgas
la source
la source
Pour effectuer cette requête sur une
DataContext
classe, vous devez effectuer les opérations suivantes:Sans le,
as IEnumerable<DataRow>;
vous verrez l'erreur de compilation suivante:la source
Créez un ensemble d'objets de transfert de données, quelques mappeurs et renvoyez-le via le .asmx.
Vous ne devez jamais exposer directement les objets de la base de données, car une modification du schéma de procédure se propagera au consommateur de service Web sans que vous ne vous en rendiez compte.
la source
Si vous utilisez un type de retour de
IEnumerable
, vous pouvez renvoyer directement votre variable de requête .la source
Créez un objet de classe et renvoyez un
list(T)
de la requête.la source
Si vous utilisez
IEnumerable
comme type de retour, il renverra directement votre variable de requête.la source
Par souci d'exhaustivité, ces solutions ne fonctionnent pas pour EF Core (du moins pas pour EF Core 2.2). La diffusion vers
IEnumerable<DataRow>
, comme suggéré dans les autres réponses ici, échoue. L'implémentation de cette classe et de ces méthodes d'extension a fonctionné pour moi https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .Pourquoi il n'est pas intégré à EF Core, je n'en ai aucune idée.
la source