Remplissage d'un DataSet ou d'un DataTable à partir d'un jeu de résultats de requête LINQ
-
08-06-2019 - |
Question
Comment exposer une requête LINQ en tant que service Web ASMX ?Habituellement, depuis le niveau entreprise, je peux renvoyer un message dactylographié DataSet
ou DataTable
qui peut être sérialisé pour le transport via ASMX.
Comment puis-je faire la même chose pour une requête LINQ ?Existe-t-il un moyen de remplir un formulaire tapé 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
?Alternativement, la requête LINQ est-elle sérialisable afin que je puisse l'exposer en tant que service Web ASMX ?
La solution
Comme mentionné dans la question, IEnumerable
a un CopyToDataTable
méthode:
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>();
Pourquoi ça ne marchera pas pour vous ?
Autres conseils
Pour effectuer cette requête sur un DataContext
classe, vous devrez 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 casting ?)
Créez un ensemble d'objets de transfert de données, quelques mappeurs et renvoyez-le via le .asmx.
Tu devrais jamais exposez directement les objets de la base de données, car une modification du schéma de procédure se propagera au consommateur du service Web sans que vous vous en rendiez compte.
Si vous utilisez un type de retour de IEnumerable
, vous pouvez retourner votre requête variable directement.
Créez un objet de classe et renvoyez un list(T)
de la requête.
Si vous utilisez le type de retour de IEnumerable
.Cela permet de renvoyer directement votre variable de requête.
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>();