7
votes

LINQ to SQL: sur le traitement de la charge d'associations chargées paresseuses

Si j'ai un objet que paresseux charge une association avec de très gros objets, est-il possible de traiter au moment où la charge paresseuse se produit? Je pensais pouvoir utiliser Associatewith ou Liberarbith à partir de Dataloadoptions, mais il existe des restrictions très spécifiques sur ce que vous pouvez faire dans ceux-ci. Fondamentalement, je dois être notifié lorsqu'une entité <> décide qu'il est temps de charger l'objet associé, de sorte que je puisse attraper cet événement et faire du traitement sur l'objet chargé. Je ne veux pas simplement marcher sur l'entité lors de la chargement de l'objet parent, car cela obligera tous les articles chargés de paresseux à charger (vaincre le but de la charge paresseuse entièrement).


1 commentaires

Vous utilisez le terme Entityset <> où LINQ à SQL utilise la table <>. Utilisez-vous la framework d'entité à la place? Si oui, je crois que j'ai votre réponse.


4 Réponses :


1
votes

Je ne vois aucun point d'extensibilité pour cela disponible; La seule chose que je peux voir est dans l'entité FK, il existe une méthode créée sur chaque objet individuel qui est tiré du constructeur ...

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

hth.


1 commentaires

Eh bien, cela n'a pas aidé directement, mais cela m'a rappelé que Plinqo a une méthode onlorée que je peux utiliser. Toujours pas parfait, mais cela peut me procurer mon problème actuel.



1
votes

Il existe un groupe de méthodes d'extensibilité intégrées aux classes de données DataContext et de données générées par LINQ2SQL.

http://msdn.microsoft.com/en-us/library /bb882671.aspx

http: //csainty.blogspot .COM / 2008/01 / LINQ-TO-SQL-Extending-Data-Classes.html

L'une d'entre elles peut être capable de servir le but dont vous avez besoin.


0 commentaires

2
votes

abonnez-vous à l'événement ListChanged

Entityset expose un événement appelé listeChanged que vous pouvez utiliser pour détecter si un élément est en cours d'ajout. Évaluez la propriété ListCHANGEDTYPE de ListCHANGEDEventargs. Voici un lien vers les valeurs disponibles dans la liste ListchangedType Enum.

Il n'y a aucun risque de forcer la charge à exécuter aussi longtemps que vous évitez de demander à l'énumérateur.

http://msdn.microsoft.com/fr -us / bibliothèque / system.componentmodel.asptchangedtype.aspx


3 commentaires

Ne fonctionnera pas, la fonction de charge () sur l'entité de l'entité, qui énumérera la source ienumérable (= paresseuse), ne soumettra aucun listchigeant.


Il doit remplir une pleuvation intérieure lors du chargement. Je me demande si les dernières extensions RX (Extensions réactives) pourraient aider à détecter le chargement. Voir msdn.microsoft.com/en-us/devlabs/ee794896.aspx.


Il remplit effectivement une liste intérieure, ce qui n'améliore aucune notification de liste de liste.



0
votes

Vous n'êtes certainement pas obligé d'utiliser l'entité par défaut <> mais peut utiliser une collection IList <>. J'ai fait une petite réflexion sur l'entité d'entité <> mais n'a trouvé aucun crochet dans la méthode de charge (), qui implémente l'énumération de la source paresseuse de l'entité définie (c'est là que l'entité est réellement interrogée et matérialisée).

LINQ à SQL utilisera la méthode ASSIGN () pour attribuer une source iEnumerable (qui est paresseuse par défaut) à votre collection. À partir de là, vous pouvez implémenter votre propre entité de chargement paresseux avec un crochet personnalisé au point que vous énumérez d'abord la collection source (exécuter la requête).


0 commentaires