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

voix
109

Comment pouvez -vous exposer une requête LINQ en tant que service web ASMX? En règle générale, à partir du niveau de l' entreprise, je peux retourner un dactylographiée DataSetou DataTablequi peut être sérialisé pour le transport sur ASMX.

Comment puis - je faire la même chose pour une requête LINQ? Est - il un moyen de remplir un dactylographiée DataSetou DataTablevia 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 DataSetou DataTable? Sinon, est le serializeable de requête LINQ afin que je puisse l' exposer en tant que service web ASMX?

Créé 01/08/2008 à 05:59
source utilisateur
Dans d'autres langues...                            


7 réponses

voix
76

Comme il est mentionné dans la question, IEnumerablea une CopyToDataTablemé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 pas ce travail pour vous?

Créé 15/08/2008 à 17:27
source utilisateur

voix
24

Pour effectuer cette requête sur une DataContextclasse, 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 la , as IEnumerable<DataRow>;vous verrez l'erreur de compilation suivante:

Impossible de convertir implicitement le type « System.Collections.Generic.IEnumerable » à « System.Collections.Generic.IEnumerable ». Il existe une conversion explicite (il manque un casting? vous)

Créé 13/02/2009 à 01:10
source utilisateur

voix
21

Faire un ensemble d'objets de transfert de données, deux cartographes, et revenir que par le .asmx.
Vous devriez jamais exposer les objets de base de données directement, comme un changement dans le schéma de la procédure se propage au consommateur de services Web sans vous en apercevoir.

Créé 15/08/2008 à 17:42
source utilisateur

voix
15

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

Créé 01/08/2008 à 15:10
source utilisateur

voix
10

Créer un objet de classe et retourner une list(T)de la requête.

Créé 08/08/2008 à 13:17
source utilisateur

voix
3

Si vous utilisez le type de retour de IEnumerable.Aider les retourner 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>();
Créé 11/04/2018 à 11:55
source utilisateur

voix
0

Par souci d'exhaustivité, ces solutions ne fonctionnent pas pour EF de base (du moins pas pour EF de base 2.2). L'association à IEnumerable<DataRow>, comme suggéré dans les autres réponses ici, échoue. La mise en œuvre ces méthodes de classe et d' extension travaillé pour moi https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow .

Pourquoi ce n'est pas intégré dans EF Core je n'ai pas idée.

Créé 20/06/2019 à 23:14
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more