Jak udostępnić zapytanie LINQ jako usługę sieciową ASMX? Zwykle z poziomu biznesowego mogę zwrócić wpisany DataSet
lub DataTable
serializowany do transportu przez ASMX.
Jak mogę zrobić to samo dla zapytania LINQ? Czy istnieje sposób na wypełnienie wpisanego DataSet
lub DataTable
za pośrednictwem zapytania 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ę uzyskać zestaw wyników zapytania LINQ do DataSet
lub DataTable
? Alternatywnie, czy zapytanie LINQ można serializować, aby można było je ujawnić jako usługę sieci Web ASMX?
c#
linq
web-services
.net-3.5
Geoff Dalgas
źródło
źródło
Aby wykonać to zapytanie w stosunku do
DataContext
klasy, musisz wykonać następujące czynności:Bez tego
as IEnumerable<DataRow>;
zobaczysz następujący błąd kompilacji:źródło
Stwórz zestaw obiektów transferu danych, kilka mapperów i zwróć go za pośrednictwem pliku .asmx.
Nigdy nie należy bezpośrednio ujawniać obiektów bazy danych, ponieważ zmiana w schemacie procedury będzie propagowana do konsumenta usługi WWW bez zauważenia tego.
źródło
Jeśli używasz zwracanego typu
IEnumerable
, możesz bezpośrednio zwrócić zmienną zapytania .źródło
Utwórz obiekt klasy i zwróć
list(T)
zapytanie.źródło
Jeśli użyjesz
IEnumerable
jako typu zwracanego, zwróci on bezpośrednio zmienną zapytania.źródło
Ze względu na kompletność te rozwiązania nie działają w przypadku EF Core (przynajmniej nie w przypadku EF Core 2,2). Przesyłanie do
IEnumerable<DataRow>
, jak sugerowano w innych odpowiedziach, kończy się niepowodzeniem. Wdrożenie tej klasy i metod rozszerzających 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.
źródło