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

Comment exposer une requête LINQ en tant que service Web ASMX? Habituellement, à partir du niveau métier, je peux retourner un DataSet ou un 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? Est-il possible de remplir un DataSet ou un 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 pour que je puisse l'exposer comme un service Web ASMX?

0
ajouté édité
Vues: 28

5 Réponses

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

0
ajouté

Comme il est mentionné dans la question, IEnumerable a CopyToDataTable :

IEnumerable query =
    from order in orders.AsEnumerable()
    where order.Field("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable();

Pourquoi cela ne fonctionnera-t-il pas pour vous?

0
ajouté
Pour tout le monde se demandant pourquoi CopyToDataTable() ne fonctionne pas sur leur machine: Cette fonction ne fait pas partie de .NET 3.5 SP1 et ne sera pas de .NET 4.0; il a été restreint à IEnumerable et ne fonctionne pas pour IEnumerable - bit.ly/dL0G5
ajouté l'auteur motto, source

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

0
ajouté

Créez un ensemble d'objets de transfert de données, un couple de mappeurs, et renvoyez-le via le fichier .asmx.
Vous ne devriez jamais exposer directement les objets de la base de données, car une modification du schéma de la procédure sera propagée au consommateur du service Web sans que vous ne le remarquiez.

0
ajouté

Si vous utilisez le type de retour de IEnumerable . Cela permet de renvoyer directement votre variable de requête.

MyDataContext db = new MyDataContext();
IEnumerable query = 
    (from order in db.Orders.AsEnumerable()
        select new
        {
            order.Property,
            order.Property2
        })
    as IEnumerable;
return query.CopyToDataTable();
0
ajouté