7
votes

Données de retour de la base de données dans .NET: renvoyer une carte de données ou une liste ?

Je me débats avec la suppression des concepts de bonne conception de base de données avec un bon design orienté objet.

Traditionnellement si je voulais afficher une liste de nouvelles dans un répéteur, j'utiliserais quelque chose comme: < Pré> xxx

ici news.getallNews () retourne un DataTable , qui n'est qu'une vidage de la procédure stockée. La procédure stockée est écrite pour renvoyer les données à l'aide de jointures. Il s'agit donc de plus d'une tables de données.

L'avantage de ceci dans la base de données La procédure stockée peut rechercher qui a ajouté la nouvelle Le ajouté qui existe dans la table News et renvoie le nom complet des personnes comme la ajout de la valeur retournée.

Toutefois si J'essaie de laisser tomber l'utilisation d'un jeu de données et renvoyez plutôt une liste des objets de presse, je reçois ce qui suit: xxx

mais maintenant je suis laissé avec le problème que certains Les valeurs que je veux afficher (comme ajout (Strong> ajouté ) n'existent pas dans l'objet News, car ils ne sont pas quelque chose qui est explicitement défini, mais au lieu de récupérer d'un identifiant de recherche dans l'objet.

J'aimerais retourner des objets plutôt que pour les tatables, mais je ne connais pas la meilleure façon de combler cette lacune.

Dois-je:
* Créez des propriétés supplémentaires dans la catégorie Actualités pour chaque valeur supplémentaire pouvant être renvoyée à partir de la base de données par rapport à ces données?
* Coller avec datables pour des cas spécifiques où qui sont beaucoup de valeurs supplémentaires?

ou suis-je totalement sur la mauvaise piste!


0 commentaires

3 Réponses :


0
votes

bonne question:

Il y a quelques approches que vous pouvez prendre:

  1. Vous pouvez récupérer les données supplémentaires dont vous avez besoin sur l'événement contraignant du répéteur et le peupler dans un "espace réservé" pour chaque enregistrement de presse renvoyé. Cela a des problèmes de performance en raison de l'interrogation supplémentaire, mais cela fonctionnera.

  2. Si possible, je modifierais l'objet News pour contenir les informations supplémentaires ou créer un objet qui hérite de l'objet News qui possédait des informations supplémentaires ou des propriétés contenues à l'intérieur.

    J'espère que cela aide :-) +1

    Edit / Commentaire: Je pense que le frottement que vous voyez dans votre conception est que vous ne reconnaissez pas la relation "HAS-A" entre votre objet d'information et ce que j'appellerais son auteur / contributeur. La jointure que vous faites dans votre requête consiste simplement à dissimuler le manque de relation dans le modèle d'objet.


2 commentaires

Merci pour l'entrée Achille: 1) Semblable à la suggestion de Gregoire. Comme vous dites que cela fera le travail, mais ce type d'approche semble être un travail supplémentaire? 2) Je sais que cela sera plus efficace, mais cela ressemble toujours à un peu de Spikey ... bien que je préfère cela sur l'option 1 I Office J'espère qu'une suggestion qui ressemble à droite, où ces approches ne ressentent pas tout à fait un ajustement parfait.


Je pense que le frottement que vous voyez dans votre conception est que vous ne reconnaissez pas la relation "HAS-A" entre votre objet d'information et ce que j'appellerais son auteur / contributeur. La jointure que vous faites dans votre requête consiste simplement à dissimuler le manque de relation dans le modèle d'objet.



0
votes

Vous pouvez essayer ceci, peut-être pas la meilleure solution: xxx


2 commentaires

Ce type d'approche a traversé mon esprit, mais cela semble faire quelque chose qui serait mieux géré par une jointure dans une procédure stockée. Mais alors peut-être que c'est plus OO? :)


@Peter, vous devez faire le filtrage des données au niveau de la base de données. Vous pourriez passer dans NEW.GETALLNEWS (UtilisateursConsed) et gérer le tableau de votre proc. Cela pourrait réduire considérablement la quantité de trafic réseau en fonction de vos données.



4
votes

Vos choix sont restreints par la technologie sous-jacente que vous êtes prêt à utiliser comme accès aux données. À l'heure actuelle, plusieurs alternatives sont nécessaires pour que le VS Toolset et .NET Framework prend en charge:

  • classique ado.net 2.0. Concevoir dans Datasets dactylographiés et datatable objets dans le code.
  • LINQ à SQL . Conception de Linq O / R Design Modeler , utilisez iquéryable et la syntaxe Linq dans le code. < / li>
  • cadre d'entité . Conception dans le Modeleur de données d'entité , utilisez des entités dans votre code. < / li>
  • Outils Orm 3rd Party comme NHibernate . Chacun a sa propre concepteur et un type d'objet de code spécifique.

    de ceux-ci, tous sauf ado.net dactylography dactylography vous permettent de spécifier les relations de navigation telles que vous demandez, soit chargée avec impatience ou paresseusement. Dans un cas comme si vous décrivez que le THing naturel de ces technologies serait de modéliser les relations entre l'article de presse et l'auteur explicitement dans les concepteurs et laisser le cadre traiter avec le problème de la chargement des données appropriées et des types appropriés, en fin de compte. que le problème de jointure est traité implicitement par la couche d'accès aux données de l'application (le cadre) plutôt que par une procédure stockée explicitement créée.

    Le choix de la technologie vous entraînera partout dans votre code, de la manière dont vous récupérez vos données sur la manière dont vous l'affichez et comment vous mettez à jour, aucune de ces technologies ne sont facilement interchangeables. Personnellement, je trouve que le bon équilibre entre puissance et complexité est avec Linq à SQL.


3 commentaires

Merci pour votre entrée Remus - j'ai entendu SM arrêtait le développement de Linq à SQL en faveur du cadre de l'entité. Est-ce vrai et si oui, encourageriez-vous de nouveaux développements en utilisant cette technologie?


@Peter: Je ne suis plus avec Mme alors je ne saurais pas vraiment plus que la connaissance du public. Est vrai que EF est la voie recommandée à l'avenir, mais compte tenu de l'adoption écrasante de LINQ à SQL par rapport à EF, je serais suturé de le voir complètement abandonné.


J'utilise actuellement et profitez de LINQ2SQL pour un projet .NET 3.5. Mon prochain grand projet utilisera .NET 4.0, donc je vais utiliser l'entité Framework 4.0