2009-12-29 3 views
2

Une question m'a été posée dans Interview. Comment allez-vous remplir vos objets personnalisés avec des données renvoyées à partir d'un lecteur de données.Remplissage d'un objet à partir d'un lecteur de données

Ma réponse utilisait datareader.read(), créant une instance de l'objet personnalisé et définissant des propriétés avec des valeurs de lecteur de données.

L'intervieweur n'était pas content. Il a dit que si j'ai des millions de dossiers, il sera très lent de remplir ces dossiers en utilisant mon approche. Il m'a demandé de suggérer une autre voie.

Existe-t-il un autre moyen? Commentez s'il vous plaît.

+0

Pourquoi demanderiez-vous des millions de lignes? Si vous souhaitez calculer des valeurs agrégées, vous devez demander au serveur de faire le travail et de renvoyer le résultat. Si vous devez afficher des millions de lignes à l'utilisateur, vous devez utiliser la pagination et extraire uniquement les lignes à afficher. L'intervieweur a-t-il expliqué * pourquoi * il devait aller chercher des millions de lignes? L'avez-vous interrogé à ce sujet? –

+0

Il a dit qu'il ne voulait pas faire le tour de ces disques. – Rohit

Répondre

5

Votre approche est parfaitement valide et utilisée dans de nombreux endroits. Maintenant, si vous avez des millions d'enregistrements, vous n'aurez probablement pas envie de remplir un objet en mémoire de toute façon. Mais je suppose que cela dépendra de ce que vous allez faire avec l'objet. Si l'intervieweur a dit qu'il ne voulait pas boucler ces enregistrements, cela va à l'encontre de l'objectif d'un lecteur de données.

+0

> Si vous avez des millions d'enregistrements, vous ne le ferez probablement pas ... Je suis d'accord! Si vous avez des milliers d'enregistrements, je préfère utiliser DataAdapter.Fill() sur le lecteur de données. Personnellement, j'aime aussi les ensembles de données fortement typés ou même ces solutions ORM: http://www.llblgen.com/defaultgeneric.aspx http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework http://en.wikipedia.org/wiki/NHibernate – Thomas3D

+4

Quel est l'avantage générique de l'utilisation de DataAdapter? DataAdapter utilise juste un DataReader dans les coulisses de toute façon. – fearofawhackplanet

1

Avez-vous suggéré de stocker les objets métier dans un type de structure de données en mémoire? Si oui, peut-être que l'intervieweur était intéressé par une solution où les objets sont instanciés dans une méthode de générateur et retournés au consommateur en utilisant yield return?

+0

La sortie doit être une collection contenant toutes ces valeurs. EST-il possible d'utiliser le rendement du rendement? – Rohit

+0

Généralement, vous souhaitez fermer votre connexion à la base de données dès que vous le pouvez. L'utilisation d'un générateur ne peut qu'accroître la durée d'ouverture de la connexion. –

1

Cela dépend vraiment du scénario - il n'y a pas des exigences assez là, mais quelques réflexions:

  • bloc iterator (yield return) évite d'avoir à tampon toutes les données
  • si vous écriviez spécifique C# code par type, alors c'est bien - mais vous ne devriez pas utiliser la réflexion (brute) si la performance est critique; une méthode dynamique (ILGenerator etc, ou Expression), ou quelque chose comme HyperDescriptor peut prendre l'aiguillon de la réflexion
  • si elles veulent une collection, la collection pourrait se être paresseux chargé que vous consommez, mais vous ne être en mesure d'obtenir le Count à l'avance, sauf si votre TSQL renvoie ce premier
  • Il pourrait être argument qu'un constructeur pourrait être plus rapide que d'utiliser des propriétés individuelles, mais franchement, je soupçonne qu'il ne l'a pas profilé; il y aura rarement différence significative entre les propriétés de réglage et les champs (à l'intérieur du ctor). En fait, je prépare un billet de blog sur ce sujet précis que j'écris ...
+0

mais l'utilisation de 'yield' maintiendra cette connexion de données ouverte pendant un long temps (potentiel) –

+0

C'est un compromis, bien sûr ;-p Beaucoup de mémoire par rapport à une connexion ouverte. Comme je l'ai dit, cela dépend des exigences. –

0

Ma réponse immédiate à la question: « Comment trouvez-vous est de remplir vos objets personnalisés avec les données renvoyées d'un DataReader? » est, "En utilisant la composition." Apparemment, l'interviewer pensait qu'il posait une question différente et beaucoup moins intéressante.

Questions connexes