Remplissage d'un DataSet ou d'un DataTable à partir d'un jeu de résultats de requête LINQ

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 ?

请先 登录 后评论

4 réponses

Dave Ward

Si vous utilisez un type de retour de IEnumerable, vous pouvez renvoyer directement votre variable query.

请先 登录 后评论
Brian Childress

Créez un objet de classe et renvoyez un list(T) de la requête.

请先 登录 后评论
Lars Mæhlum

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.

请先 登录 后评论
Community

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 ?)

请先 登录 后评论
  • 8 abonnés
  • 0 favoris,611 Feuilleter
  • Geoff Dalgas posée à 2022-09-13 05:13