2008-08-01 7 views
106

Comment exposer une requête LINQ en tant que service Web ASMX? Habituellement, à partir du niveau de l'entreprise, je peux retourner un DataSet typé ou DataTable qui peut être sérialisé pour le transport sur ASMX. Comment faire la même chose pour une requête LINQ?Remplissage d'un DataSet ou DataTable à partir d'un ensemble de résultats de requête LINQ

Existe-t-il un moyen de renseigner un DataSet tapé 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 pour que je puisse l'exposer comme un service Web ASMX?

Répondre

73

Comme mentionné dans la question, IEnumerable a une méthode CopyToDataTable:

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 pas ce travail pour vous?

+28

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 - http://bit.ly/dL0G5 – motto

13

Si vous utilisez un type de retour IEnumerable, vous pouvez renvoyer votre variable requête directement.

7

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

18

Créez un ensemble d'objets de transfert de données, deux mappeurs, et renvoyez-les via le fichier .asmx.
Vous ne devez jamais exposer les objets de base de données directement, car une modification dans le schéma de procédure va se propager au consommateur de service Web sans que vous le remarquiez.

22

Pour effectuer cette requête sur une classe DataContext, vous devrez effectuer les opérations suivantes:

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 as IEnumerable<DataRow>; vous verrez l'erreur de compilation suivante:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

Questions connexes