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

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

7
задан Matt Holmes 30 April 2010 в 17:37
поделиться

4 ответа

Подписка на событие ListChanged

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

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

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

2
ответ дан 7 December 2019 в 14:29
поделиться

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

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

HTH.

1
ответ дан 7 December 2019 в 14:29
поделиться

Существует множество встроенных методов расширения классов 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

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

1
ответ дан 7 December 2019 в 14:29
поделиться

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

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

0
ответ дан 7 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: