LINQ to SQL: по обработке нагрузки ленивых загруженных ассоциаций

Если у меня есть объект, который лениво загружает ассоциацию с очень большими объектами, есть ли способ выполнить обработку во время ленивой загрузки? Я думал, что могу использовать AssociateWith или LoadWith из DataLoadOptions, но есть очень, очень конкретные ограничения на то, что вы можете сделать в них. В основном мне нужно уведомляться, когда EntitySet решает, что пришло время загрузить Связанный объект, поэтому я могу поймать это событие и выполнить некоторую обработку загруженного объекта. Я не хочу просто пройдите через EntitySet при загрузке родительского объекта, потому что это заставит все ленивые загруженные элементы загружаться (полностью отменяя цель ленивой загрузки).

4 ответов


подпишитесь на событие ListChanged

EntitySet предоставляет событие с именем ListChanged, которое можно использовать для обнаружения добавления элемента. Оцените свойство ListChangedType объекта ListChangedEventArgs. Вот ссылка на значения, доступные в перечислении ListChangedType.

никакая опасность принуждать нагрузку выполнить покуда вы избегаете запросить перечислитель.

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


Я не вижу точек расширяемости для этого; единственное, что я вижу, это то, что в сущности FK есть созданный метод для каждого отдельного объекта, который запускается из конструктора...

таким образом, конструктор вызывает created, и лично я не уверен на 100%, что загрузка набора сущностей создает каждый отдельный объект в то время и запускает событие...

HTH.


существует множество встроенных методов расширяемости для классов datacontext и data, генерируемых Linq2SQL.

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

http://csainty.blogspot.com/2008/01/linq-to-sql-extending-data-classes.html

любой из них может служить нужной вам цели.


вы определенно не обязаны использовать по умолчанию EntitySet<> но вместо этого можно использовать любую коллекцию IList. Я немного подумал о EntitySet, но не нашел крючка в методе Load (), который реализует перечисление ленивого источника набора сущностей (именно там EntitySet фактически запрашивается и материализуется).

Linq to SQL будет использовать метод Assign () для назначения IEnumerable источника (который по умолчанию является ленивым) вашей коллекции. Начиная оттуда, вы можете реализуйте собственную ленивую загрузку EntitySet с пользовательским крючком в точке первого перечисления исходной коллекции (выполнить запрос).