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