Ich würde ozczecho unterstützen - warum sollten Sie jemals 10M wollen Datensätze zurück? Werden Ihre Kunden WIRKLICH 10M Bestellungen durchforsten? Ich bezweifle es sehr ...
Begrenzen Sie die Nummer - z. Datumsbereiche (alle Bestellungen von 1Q/09) oder nach anderen Kriterien. Nur weil Sie 10M Zeilen zurückgeben können, bedeutet das nicht, dass es wirklich eine gute Idee ist.
Auch zusammen mit SQL Server können Sie problemlos Paging, z. Sie könnten Ihren WCF-Dienst die erste z. 100 Zeilen, und senden Sie eine Markierung zurück, die anzeigt, dass es mehr gibt, und lassen Sie dann Ihren Klienten Reihen 101 bis 200 etc. anfordern. Es erfordert ein wenig Logik, aber es würde Kommunikation so viel einfacher (und schneller) machen!
Auch in WCF müssen Sie maximale Nachrichtengrößen definieren - sie sind normalerweise bei 64 KB. Der Grund dafür ist die Tatsache, dass eine Nachricht vollständig im Speicher gesammelt werden muss, bevor sie übertragen werden kann. Stellen Sie sich vor, Sie haben 50 Clients auf Ihrem Server - wie viel Speicher können Sie wirklich für "Message Assembly" auf Ihrem Server reservieren?
Marc
UPDATE:
Eine Möglichkeit, Paging in einem Service erreichen kann, indem man einen Anruf etwas so sein würde:
Diese
[OperationContract]
public List<Orders> GetOrders(string searchCriteria, string sortExpression,
int skipFirstRows, int takeRows)
ist inspiriert von der .skip() und .Take() - Erweiterungsmethoden, die von LINQ eingeführt wurden.
In diesem Fall könnten Sie GetOrders aufrufen und einige Suchkriterien definieren (dies könnte auch eine Klasse anstelle einer Zeichenfolge sein), um Ihre Bestellungen zu sortieren. Sie können festlegen, wie die Bestellungen sortiert werden, indem sortExpression
und dann sagst du dem Dienst, dass du die ersten n Zeilen überspringen willst und nimm dann x Zeilen.
So ein Anruf
List<Orders> result = GetOrders(criteria, sort, 0, 50)
würden die ersten 50 Reihen holen. Sobald Sie fertig sind, können Sie wieder anrufen:
List<Orders> result = GetOrders(criteria, sort, 50, 50)
und jetzt würden Sie die ersten 50 Zeilen überspringen (die Sie bereits angezeigt/berichtet), und dann nehmen Sie die nächsten 50 (Zeilen 51- 100).
Wenn Ihr WCF-Dienst im Back-End LINQ verwendet, können Sie dies natürlich direkt in Aufrufe von .Skip() und .Take() in Ihren LINQ-Abfragen umsetzen!:-)
UPDATE 2:
Arbeiten Sie gegen SQL Server 2005 oder höher? Schauen Sie sich die Common Table Expressions (CTE) an, die im Grunde genommen die Grundlage für LINQ sind. Dadurch können Sie eine "virtuelle" Sicht auf Ihre Daten definieren und nur einen bestimmten Abschnitt des Datensatzes auswählen.
Weitere Informationen hier:
1. Wenn ich nicht 10M Datensatz zurückgeben, wie könnte Client kennt den genauen Status aller Aufträge? Noch mehr Ratschläge? 2. Verwenden Sie Paing-Technologien - Ich kenne nur Paging von ASP.Net und weiß nicht, wie man es in WCF verwendet, irgendwelche Ratschläge? – George2