Je soutiendrais ozczecho - pourquoi voudriez-vous jamais retourner des enregistrements de 10M? Vos clients vont-ils vraiment vouloir passer au crible les commandes de 10M? J'en doute fortement ...
Limiter le nombre - par ex. plages de dates (tous les ordres du 1er trimestre 2009), ou par tout autre critère. Ce n'est pas parce que vous pouvez renvoyer 10 millions de lignes que ce sera vraiment une bonne idée.
De même, avec SQL Server, vous pouvez facilement implémenter le paging, par ex. vous pourriez demander à votre service WCF de renvoyer la première par ex. 100 lignes, et renvoyez un drapeau indiquant qu'il y en a plus, puis demandez à votre client de demander les lignes 101 à 200, etc. Cela prend un peu de logique, mais cela rendrait la communication tellement plus facile (et plus rapide)!
En outre, dans WCF, vous devez définir des tailles de message maximales - elles sont normalement à 64 Ko. La raison en est le fait qu'un message doit être assemblé en mémoire, dans son intégralité, avant de pouvoir être transmis. Imaginez que vous avez 50 clients sur votre serveur - combien de mémoire pouvez-vous vraiment mettre de côté pour "l'assemblage de messages" sur votre serveur?
Marc
MISE À JOUR:
Une façon vous pouvez obtenir la pagination dans un service serait en ayant un quelque chose d'appel comme celui-ci:
[OperationContract]
public List<Orders> GetOrders(string searchCriteria, string sortExpression,
int skipFirstRows, int takeRows)
Ceci est inspiré par le .Skip() et .Take() méthodes d'extension introduites par LINQ. Dans ce cas, vous pouvez appeler GetOrders et définir des critères de recherche (qui peuvent également être une classe, au lieu d'une simple chaîne) pour correspondre à vos commandes, vous pouvez définir comment trier les ordres en spécifiant sortExpression
, et Ensuite, vous dites au service que vous voulez ignorer les n premières lignes, puis prendre x lignes.
donc un appel
List<Orders> result = GetOrders(criteria, sort, 0, 50)
allait chercher les 50 premières lignes. Une fois que vous avez terminé, vous pouvez appeler à nouveau:
List<Orders> result = GetOrders(criteria, sort, 50, 50)
et maintenant vous voulez sauter les 50 premières lignes (que vous avez déjà affiché/rapporté) et vous prenez les 50 prochaines (lignes 51- 100).
Bien sûr, si votre service WCF sur le backend utilise LINQ, vous pouvez le traduire directement en appels à .Skip() et .Take() sur vos requêtes LINQ!:-)
MISE À JOUR 2:
travaillez-vous contre SQL Server 2005 ou plus? Découvrez les expressions de table communes (CTE) qui sont à la base de ce que fait LINQ. Cela vous permet de définir une vue "virtuelle" sur vos données et de sélectionner uniquement une certaine section de l'ensemble de données.
Voir plus d'informations ici:
1. Si je ne reviens pas 10M dossier, comment pourrait-client connaît le statut exact de tous les ordres? D'autres conseils? 2. Utiliser les technologies Paing - Je ne connais que la pagination depuis ASP.Net, et je ne sais pas comment l'utiliser dans WCF, un conseil? – George2