2009-03-06 6 views
0

J'ai une requête SQL qui peut ramener un grand nombre de lignes via un DataReader. Tout à l'heure j'interroge la DB transforme l'ensemble de résultats dans une liste (de) et les données lient la grille à la liste.Chargement paresseux sur une collection d'objets

Cela peut occasionnellement entraîner un dépassement de délai en raison de la taille de l'ensemble de données.

J'ai actuellement une configuration trois teir où par l'interface utilisateur agit sur la liste des objets dans la couche de gestion.

Quelqu'un peut-il suggérer la meilleure approche pour implémenter le chargement paresseux dans ce scénario? ou y a-t-il une autre façon de mettre cela en pratique?

Je suis actuellement en utilisant Visual Studio 2005, .NET 2.0

EDIT: Comment utiliser la pagination dans ce cas?

Répondre

1

LINQ to SQL semble logique dans votre situation.

Sinon, si pour une raison quelconque, vous ne voulez pas utiliser LINQ to SQL (par exemple, vous êtes sur .NET 2.0), envisager d'écrire un itérateur qui lit le DataReader et il convertit à l'objet approprié:

IEnumerator<MyObject> ReadDataReader() { 
    while(reader.MoveNext()) 
    yield return FetchObject(reader); 
} 
+0

Est-ce que LINQ est non seulement disponible en .Net 3.5? Je suis actuellement lié à 2.0 – Dean

+0

Les itérateurs fonctionnent également en 2.0. –

+0

Tandis que l'itération sur un DataReader est une astuce, je ne l'aime pas du fait que "l'objet" peut avoir une durée de vie relativement longue, et que DataReader garde la connexion DB ouverte tout le temps. – CraigTP

0

Avez-vous besoin de ramener toutes les données à la fois? Vous pourriez envisager la pagination.

0

La pagination pourrait être votre meilleure solution. Si vous utilisez SQL Server 2005 ou version ultérieure, une nouvelle fonctionnalité a été ajoutée. ROWNUMBER():

WITH MyThings AS 
(
    SELECT ThingID, DateEntered, 
    ROW_NUMBER() OVER (ORDER BY DateEntered) AS 'RowNumber' 
    FROM dbo.Things 
) 
SELECT * 
FROM ThingDetails 
WHERE RowNumber BETWEEN 50 AND 60; 

Il y a un example par David Hayden, qui est très utile pour démontrer le SQL.

Cette méthode réduirait le nombre d'enregistrements renvoyés, réduisant ainsi le temps de chargement global. Cela signifie que vous devrez en faire un peu plus pour savoir où vous en êtes dans la séquence d'enregistrements, mais cela en vaut la peine.
La technique de pagination standard nécessite que tout revienne de la base de données et soit filtré au niveau intermédiaire, ou au niveau client (code-behind) cette méthode réduit les enregistrements à un sous-ensemble plus gérable.

Questions connexes