Die Ergebnisse der Abfrage können nicht aufgezählt werden mehr als einmal?
Bin ich mit LINQ to SQL zu bekommen Suche Ergebnis einer FullTextSearch gespeicherte Prozedur in Sql server 2008. Ich schleppte das Verfahren aus dem server-explorer auf den designer, und bekam die Methode erstellt mit dem entsprechenden Rückgabetyp und Parameter. Das problem ist nun, ich brauche, um die Anzahl der das Ergebnis des Aufrufs dieser Methode, so mit meinem repository-Methode (die nennen die Sproc-Methode auf und gibt das Ergebnis als IQueryable) habe ich den folgenden Aufruf.
var result = repository.FullTextSearch(searchText);
int resultsCount = result.Count();
var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
Dieser code erzeugt eine InvalidOperationException jedes mal, wenn ich versuche es zu starten, die exception sagt (ja, Sie Ahnen es!) "Die Ergebnisse der Abfrage können nicht aufgezählt werden, mehr als einmal."
Die Methode, die generiert wurde, für die Sproc gibt ISingleResult die sollten O. K., soweit ich weiß. Ich brauche die Unterstützung der Auslagerung auf meine Ansicht, also muss ich wissen, die Gesamtzahl der Seiten, die (AFAIK wieder) ist nur möglich, wenn ich könnte Holen Sie sich die Anzahl aller Elemente.
Was vermisse ich hier, Jungs?
InformationsquelleAutor der Frage Galilyou | 2009-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da das ausführen einer gespeicherten Prozedur, die alle Ihre schönen
Skip
/Take
ist weitgehend redundant sowieso... es hat keine Wahl, sondern um alle die Daten zurück (gespeicherten Prozedur-Aufrufe sind nicht zusammenstellbar). Die einzige Sache, die Sie tun können, ist nicht materialisieren von Objekten für einige von Ihnen.Frage ich mich, ob der bessere Ansatz wäre, überarbeiten Sie den code, um zwei Anrufe:
D. H. die paging-Parameter Teil des SPROC (und die Filterung in der Datenbank mit
ROW_NUMBER()
/OVER(...)
- oder table-Variablen temp-Tabellen, etc) - oder alternativ etwas ähnliches mit einemOUTPUT
parameter in der sproc:(Ich scheine zu erinnern, dass
OUTPUT
wirdref
da TSQLOUTPUT
ist wirklich input+output)InformationsquelleAutor der Antwort Marc Gravell
Was Sie tun können, ist, eine
ToList()
Anruf nachrepository.FullTextSearch(searchText)
. Auf diese Weise sind die Ergebnisse, die vom server abgerufen, danach kannst du mit Ihnen machen was Sie wollen (da Sie nun geladen, in-memory).Dem, was Sie versuchen jetzt zu tun ist, führen Sie dieselbe SQL-Abfrage zweimal, was ziemlich ineffizient ist.
InformationsquelleAutor der Antwort Ronald Wildenberg
Mit
ToList()
können helfen, dieses problem zu vermeiden.InformationsquelleAutor der Antwort Sasha
Ich würde vorschlagen, dass, wenn Sie das zählen, führen Sie das Ergebnis zuerst. und dann führen Sie den count von der list selbst, da Sie nicht resultsCount die in Ihren Resultat-Ausführung.
InformationsquelleAutor der Antwort Kamal