Question

Comment exposez-vous une requête LINQ en tant que service Web ASMX? Généralement, à partir du niveau métier, je peux renvoyer un DataSet ou DataTable dactylographié pouvant ê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 renseigner une <=> ou <=> saisie avec 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 l'ensemble de résultats d'une requête LINQ dans un <=> ou <=>? Sinon, 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 indiqué dans la question, IEnumerable utilise une 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 cela ne fonctionne-t-il pas pour vous?

Autres conseils

Pour exécuter cette requête sur une DataContext classe, procédez 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 (manque-t-il un casting?)

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

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

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 vous aidera à 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