6
votes

Charge paresseuse une entité de cadre d'entité avec des critères

Dans le cadre d'entité (spécifiquement EF 3.5, mais s'il existe dans EF 4, cela me donne une raison de mettre à niveau) est-il possible d'une charge paresseuse uniquement une partie d'une collection? J'approche peut aussi que ce problème aussi, alors je suis ouvert aux suggestions. Mes tables / entités ressemblent à ceci: xxx

J'ai une liste des objets de la personne extraits via une structure d'entité via une procédure stockée. J'ai une vue qui montre seulement un repas à la fois, je ne veux donc que les informations relatives à ce repas. Actuellement, j'ai un code qui ressemble à ceci: xxx

Le problème est-il en train de charger toute la collection. Constituée C'est une petite collection si le pire des cas, je peux tout charger, puis supprimer tout sauf celui dont j'ai besoin, mais c'est loin d'être idéal. De plus, je ne suis pas sûr que s'il serait possible sans déclencher aucun des événements de modification de la collection, car ils n'auraient pas dû être là-bas en premier lieu.


6 commentaires

Est-ce que personne a une relation de plusieurs à plusieurs avec personnantmeal et personneMeal avoir une relation à plusieurs à plusieurs avec repas comme indiqué dans votre question? Ou est-ce que personne a plutôt une relation plusieurs à plusieurs avec repas , tandis que la personne personne est la table de connexion? Si tel est le cas, il ne devrait pas y avoir une entité générée pour PersonneMeal . J'ai également remarqué un champ , cependant. Pourriez-vous clarifier un peu votre structure de données? Une capture d'écran de votre EDM pourrait être utile, ainsi que votre structure de base de données.


@Yakimych Tu as raison, c'est un M2M entre personne et repas avec la personne qui joue la table / entité de liaison.


@ Agent_9191 - OK, dans ce cas, il ne devrait s'agir que d'une table personnalisée , mais aucune entité générée. La personne personne doit avoir une collection de Repas et l'entité doit avoir une collection de personnes . Avez-vous généré votre modèle de la base de données ou la créez-vous dans le concepteur? Et quelle est la propriété pour (qui pourrait être la raison pour laquelle EF génère l'entité personne )?


@Yakimych Il a été généré à partir de la base de données et l'entité personnelle est nécessaire car il existe des propriétés spécifiques à la combinaison (type de nourriture, de boisson, de vitamines, etc.). La valeur est l'une des propriétés génériques de la liste. La question de la plupart des points de vue des données ne nécessite qu'un seul repas à la fois pour une personne et comme je l'ai dit, la liste des personnes est générée à partir d'une procédure stockée, alors enchaînant Linq où les clauses ne fonctionnent pas.


@ Agent_9191 - OK, mais votre propriété de navigation doit être appelée PersonMerseals plutôt que PersonneMeal car c'est une collection. En ce qui concerne votre question: ' J'ai une vue qui montre un seul repas à la fois, je veux donc que les informations relatives à ce repas '. Comment déterminez-vous quel repas exactement pour charger et montrer?


@Yakimych J'ai l'ID du repas disponible dans la fonction GetPersons (), donc je peux faire une comparaison avec un repas donné ou un repas lui-même (récupéré séparément). Idéalement, je voudrais transmettre ce repas.Id (ou repas) à EF afin de ne charger que cette partie de la collection.


3 Réponses :


2
votes

Dans ce cas, au lieu d'utiliser la méthode , vous pouvez simplement interroger la base de données pour vos données: xxx

Je suppose que personne. PERSONMEALS est une collection, sinon vous pouvez utiliser FirstArdefault au lieu de prendre .

dans cette requête Nous sélectionnons fondamentalement tout le PERSONNESSEALS ENTITÉS (Ensemble avec le Repas ) qui ont l'identifiant de la personne en tant que personne actuelle dans la boucle et l'ID de repas que vous souhaitez. Si votre dB ne dispose pas de données corrompues (plusieurs lignes avec les mêmes combinaisons PAINT-PAINIDID), il y aura 0 ou 1 résultats, qui sera écrit dans votre propriété PersonMeals .


1 commentaires

Pas aussi élégant d'une solution que j'espérais, mais cela fonctionne.



0
votes

La réponse de Yakimych devrait fonctionner, mais le code avait quelques erreurs.

La syntaxe correcte doit être: xxx

J'espère que cela aide.


0 commentaires

1
votes

Votre question était assez claire: est-il possible de Lazily la charge seulement une partie d'une collection et la réponse est non! Pas dans EF1 ni dans EF4. BTW, si le dernier repas est le sujet, commencez à interroger par cela! Au lieu de récupérer la personne et un repas, récupérez les derniers repas et la personne attachée à elle.


2 commentaires

Juste pour clarifier - EF ne fournit pas une méthode hors de la boîte à une partie de chargement paresseux d'une collection. Et la chargement paresseux signifie que la collection Repas ne se chargée pas avec la personne , mais plutôt un peu de temps après que les personnes sont chargées. Ceci vous pouvez manifester clairement en interrogant pour les repas , cependant. Ainsi, je n'établirais pas simplement que ce n'est pas possible.


Pourquoi la réponse est non? Je pense que l'équipe EF n'est pas difficile pour mettre en œuvre quelque chose pour résoudre ce problème.