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

StackOverflow https://stackoverflow.com/questions/16

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 ?

Était-ce utile?

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>();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top