Si vous utilisez un type de retour de IEnumerable
, vous pouvez renvoyer directement votre variable query.
Comment exposez-vous une requête LINQ en tant que service Web ASMX ? Habituellement, à partir du niveau entreprise, je peux renvoyer un DataSet
ou DataTable
typé qui peut être sérialisé pour le transport sur ASMX.
Comment puis-je faire la même chose pour une requête LINQ ? Existe-t-il un moyen de remplir un DataSet
ou DataTable
typé 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 ?
Si vous utilisez un type de retour de IEnumerable
, vous pouvez renvoyer directement votre variable query.
Créez un objet de classe et renvoyez un list(T)
de la requête.
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 la procédure se propagera au consommateur du service Web sans que vous le remarquiez.
Pour effectuer cette requête sur une classe DataContext
, vous devez procéder comme suit :
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>();
Sans le as IEnumerable<DataRow>;
vous verrez l'erreur de compilation suivante :
Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable' en 'System.Collections.Generic.IEnumerable'. Une conversion explicite existe (il vous manque un cast ?)