2010-04-30 3 views
7

Si un objet qui paresseux charge une association avec des objets très volumineux, y a-t-il un moyen de traiter le chargement au moment où la charge paresseuse se produit? J'ai pensé que je pourrais utiliser AssociateWith ou LoadWith de DataLoadOptions, mais il y a des restrictions très, très spécifiques sur ce que vous pouvez faire dans ceux-ci. Fondamentalement, j'ai besoin d'être averti quand EntitySet <> décide qu'il est temps de charger l'objet associé, donc je peux attraper cet événement et faire un peu de traitement sur l'objet chargé. Je ne veux pas simplement parcourir EntitySet lorsque je charge l'objet parent, car cela forcera tous les éléments chargés paresseux à charger (en défaisant entièrement le but du chargement paresseux).LINQ to SQL: lors du chargement du chargement des associations chargées paresseuses

+0

Vous utilisez le terme EntitySet <> où LINQ to SQL utilise Table <>. Utilisez-vous Entity Framework à la place? Si oui, je crois que j'ai votre réponse. –

Répondre

2

Abonnez-vous à l'événement ListChanged

EntitySet <T> expose un événement appelé ListChanged que vous pouvez utiliser pour détecter si un élément est ajouté. Évaluez la propriété ListChangedType de ListChangedEventArgs. Voici un lien vers les valeurs disponibles dans l'énumération ListChangedType.

Il n'y a aucun risque de forcer l'exécution de la charge tant que vous évitez de demander l'énumérateur.

http://msdn.microsoft.com/en-us/library/system.componentmodel.listchangedtype.aspx

+0

Ne fonctionnera pas, la fonction Load() sur EntitySet, qui énumérera la source IEnumerable (= paresseux), ne déclenche aucun ListChangedEvents. –

+0

Il doit remplir une liste intérieure lors du chargement. Je me demande si le dernier Rx (extensions réactives) pourrait aider à détecter le chargement. Voir http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx. – randolphcabral

+0

Il remplit en effet une liste interne, qui ne déclenche aucune notification ListChanged. –

1

Je ne vois aucun point d'extensibilité pour cela disponible; la seule chose que je peux voir est dans l'entité FK il y a une méthode Created sur chaque objet individuel qui est déclenché par le constructeur ...

Ainsi les appels du constructeur sont créés, et personnellement, je ne suis pas sûr à 100% que le chargement de l'ensemble d'entités crée chaque objet individuel à ce moment-là et déclenche l'événement ...

HTH.

+1

Eh bien, cela n'a pas aidé directement, mais cela m'a rappelé que PLINQO a une méthode OnLoaded que je peux utiliser. Toujours pas parfait, mais cela peut me faire passer mon problème actuel. –

0

Vous n'êtes certainement pas tenu d'utiliser la valeur par défaut, mais EntitySet<> pouvez utiliser l'une IList <> collection à la place. J'ai fait une petite réflexion sur EntitySet <> mais je n'ai trouvé aucun point d'ancrage dans la méthode Load(), qui implémente l'énumération de la source paresseuse de l'ensemble d'entités (c'est là que EntitySet est interrogé et matérialisé). Linq To SQL utilisera la méthode Assign() pour affecter une source IEnumerable (paresseuse par défaut) à votre collection. À partir de là, vous pouvez implémenter votre propre EntitySet de chargement paresseux avec un hook personnalisé au moment où vous commencez par énumérer la collection source (exécutez la requête).

Questions connexes