Wypełnianie zbioru danych lub DataTable z zestawu wyników zapytania LINQ

Jak wyeksponować zapytanie LINQ jako usługę sieciową ASMX?
Zazwyczaj, z poziomu biznesowego, Mogę zwrócić wpisane DataSet lub DataTable, które mogą być serializowane do transportu przez ASMX.

Jak mogę zrobić to samo dla zapytania LINQ?
Czy istnieje sposób na wypełnienie wpisanego DataSet lub {[2] } poprzez zapytanie 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;
}

Jak mogę umieścić zbiór wyników zapytania LINQ w DataSet lub DataTable?
Alternatywnie, czy zapytanie LINQ może być serializowalne tak, że mogę wystawić to jako serwis internetowy ASMX?

Author: Community, 2008-08-01

7 answers

Jak wspomniano w pytaniu, IEnumerable ma metodę 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>();
Dlaczego to nie działa dla Ciebie?
 89
Author: Jon Galloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-04 09:01:40

Aby wykonać to zapytanie przeciwko klasie DataContext, musisz wykonać następujące czynności:

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>();

Bez as IEnumerable<DataRow>; zobaczysz następujący błąd kompilacji:

Nie można w domyśle przekonwertować systemu type'.Kolekcje.Ogólne.System liczbowy "do".Kolekcje.Ogólne.IEnumerable". Istnieje wyraźna konwersja (brakuje Ci obsady?)

 26
Author: C1pher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 14:39:05

Stwórz zestaw obiektów Transferu Danych, kilka maperów i zwróć je za pomocą .asmx.
Nie powinieneś nigdy wystawiać bezpośrednio obiektów bazy danych, ponieważ zmiana schematu procedury będzie rozprzestrzeniać się na konsumenta usług internetowych bez Twojej zauważenia.

 22
Author: Lars Mæhlum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 16:42:54

Jeśli używasz typu return IEnumerable, możesz bezpośrednio zwrócić zmienną query .

 15
Author: Dave Ward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 18:26:59

Tworzy obiekt klasy i zwraca list(T) zapytania.

 11
Author: Brian Childress,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 12:13:18

Jeśli użyjesz IEnumerable jako typu return, zwróci on bezpośrednio zmienną zapytania.

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>();
 2
Author: Vijay S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-22 06:45:45

Ze względu na kompletność, rozwiązania te nie działają dla EF Core (przynajmniej nie dla EF Core 2.2). Casting do IEnumerable<DataRow>, jak sugerowano w innych odpowiedziach tutaj, nie powiedzie się. Zaimplementowanie tej klasy i metod rozszerzeń zadziałało dla mnie https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/implement-copytodatatable-where-type-not-a-datarow.

Dlaczego nie jest wbudowany w EF Core, nie mam pojęcia.

 0
Author: Gabriel Magana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-20 20:14:05