LINQ to SQL: по обработке нагрузки ленивых загруженных ассоциаций
Если у меня есть объект, который лениво загружает ассоциацию с очень большими объектами, есть ли способ выполнить обработку во время ленивой загрузки? Я думал, что могу использовать AssociateWith или LoadWith из DataLoadOptions, но есть очень, очень конкретные ограничения на то, что вы можете сделать в них. В основном мне нужно уведомляться, когда EntitySet решает, что пришло время загрузить Связанный объект, поэтому я могу поймать это событие и выполнить некоторую обработку загруженного объекта. Я не хочу просто пройдите через EntitySet при загрузке родительского объекта, потому что это заставит все ленивые загруженные элементы загружаться (полностью отменяя цель ленивой загрузки).
4 ответов
подпишитесь на событие ListChanged
EntitySet
никакая опасность принуждать нагрузку выполнить покуда вы избегаете запросить перечислитель.
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 с пользовательским крючком в точке первого перечисления исходной коллекции (выполнить запрос).