c# - Remplir un DataSet ou DataTable à partir d'un ensemble de résultats de requête LINQ

Translate

Comment exposez-vous une requête LINQ en tant que service Web ASMX? Habituellement, à partir du niveau entreprise, je peux renvoyer unDataSetouDataTablequi peut être sérialisé pour le transport sur ASMX.

Comment puis-je faire de même pour une requête LINQ? Existe-t-il un moyen de remplir unDataSetouDataTablevia 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 unDataSetouDataTable? Sinon, la requête LINQ est-elle sérialisable afin que je puisse l'exposer en tant que service Web ASMX?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Comme mentionné dans la question,IEnumerablea unCopyToDataTablemé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 fonctionnera-t-il pas pour vous?

La source
Sam Lee
Translate

Pour effectuer cette requête sur unDataContextclasse, 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 leas 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 (vous manquez un casting?)

La source
Translate

Créez un ensemble d'objets de transfert de données, quelques mappeurs et renvoyez-le via le .asmx.
Vous devriezjamaisexposez directement les objets de base de données, car une modification du schéma de procédure se propage au consommateur de service Web sans que vous ne vous en rendiez compte.

La source
Translate

Si vous utilisez un type de retour deIEnumerable, vous pouvez retourner votrerequetevariable directement.

La source
Translate

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

La source
Translate

Si vous utilisez le type de retourIEnumerable.Il 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>();
La source
Translate

Par souci d'exhaustivité, ces solutions ne fonctionnent pas pour EF Core (du moins pas pour EF Core 2.2). Casting versIEnumerable<DataRow>, comme suggéré dans les autres réponses ici, échoue. L'implémentation de cette classe et des méthodes d'extension a fonctionné pour moihttps://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.

Pourquoi il n'est pas intégré à EF Core, je n'en ai aucune idée.

La source