Ich möchte IQueryable<>
result beim Ausführen der gespeicherten Prozedur erhalten.
Hier ist Code-Frieden, der gut funktioniert:
%Vor%Ich kann das verwenden, um den globalen Filter anzuwenden, und benutze später das Ergebnis auf diese Weise
%Vor% Was ich machen möchte - benutze einige gespeicherte Prozeduren im globalen Filter.
Ich habe es versucht:
Fügen Sie gespeicherte Prozedur zu m_Entities
hinzu, aber es gibt IEnumerable<>
zurück und führt sp sofort aus:
Materialize-Abfrage mit der EFExtensions-Bibliothek, aber es ist IEnumerable<>
.
Wenn ich AsQueryable()
und OrderBy()
, Skip()
, Take()
verwende
und danach ToList()
, um diese Abfrage auszuführen -
Ich bekomme eine Ausnahme, dass DataReader
offen ist und ich muss es zuerst schließen (kann nicht einfügen Fehler - es ist in russischer Sprache).
Auch das Überspringen von .AsQueryable()
ist nicht hilfreich - gleiche Ausnahme.
Wenn ich ToList()
query ausführt, führt
aus
aber es ist zu teuer, die Abfrage ohne Skip()
, Take()
auszuführen.
Sie können nicht tun, was Sie versuchen, aus dem gleichen Grund, weil Sie eine gespeicherte Prozedur nicht in eine FROM-Klausel einer SELECT-Abfrage einfügen können - SQL ist nicht dafür ausgelegt, diese Art von Operation zu unterstützen.
Könnten Sie die gewünschte Logik in eine Ansicht anstatt in eine gespeicherte Prozedur einfügen?
Sie können ein Projekt verwenden, das ich LinqToAnything erstellt habe, mit dem Sie eine nicht-abfragbare Datenzugriffsmethode erstellen und in eine IQueryable.
Ich habe einen Blogbeitrag hier zur Verwendung.
Natürlich können Sie diese Probleme mit ToList ()
umgehen %Vor%Warum können Sie das Skip () und Take () nicht auf dem Enumerable tun? Dadurch werden nur die Ergebnisse heruntergeladen, die übersprungen oder genommen wurden, die anderen werden nicht gelesen.
Bearbeiten: Die vorherige Version war in vielerlei Hinsicht falsch.
Tags und Links .net entity-framework stored-procedures linq-to-entities iqueryable