2010-04-30 20 views
7

Si tengo un objeto que carga una asociación con objetos muy grandes, ¿hay alguna manera de que pueda hacer el procesamiento en el momento en que se produce la carga lenta? Pensé que podría usar AssociateWith o LoadWith desde DataLoadOptions, pero hay restricciones muy, muy específicas sobre lo que puedes hacer en esos. Básicamente necesito ser notificado cuando un EntitySet <> decide que es hora de cargar el objeto asociado, por lo que puedo atrapar ese evento y hacer algún procesamiento en el objeto cargado. No quiero simplemente caminar a través de EntitySet cuando cargue el objeto principal, porque eso forzará la carga de todos los elementos cargados en modo perezoso (lo que frustra por completo el propósito de la carga diferida).LINQ to SQL: en el procesamiento de la carga de asociaciones con carga diferida

+0

Utiliza el término EntitySet <> donde LINQ to SQL usa Table <>. ¿Estás usando Entity Framework en su lugar? Si es así, creo que tengo tu respuesta. –

Respuesta

2

Suscribirse al ListChanged Evento

EntitySet <T> expone un evento llamado ListChanged que se puede utilizar para detectar si se está agregando un elemento. Evalúa la propiedad ListChangedType de ListChangedEventArgs. Aquí hay un enlace a los valores disponibles en la enumeración ListChangedType.

No hay peligro de forzar la ejecución de la carga siempre que evite solicitar el enumerador.

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

+0

No funcionará, la función Load() en EntitySet, que enumerará el origen IEnumerable (= perezoso), no levanta ningún ListChangedEvents. –

+0

Debe rellenar una lista interna al cargar. Me pregunto si las últimas Rx (extensiones reactivas) podrían ayudar a detectar la carga. Vea http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx. – randolphcabral

+0

Completa una lista interna, lo que no genera ninguna notificación de ListChanged. –

1

No veo ningún punto de extensibilidad para este disponible; lo único que puedo ver es que en la entidad FK hay un método Creado en cada objeto individual que se dispara desde el constructor ...

Así que las llamadas al constructor creadas, y personalmente, no estoy 100% seguro de que la carga del conjunto de entidad crea cada objeto individual en ese momento y dispara el evento ...

HTH.

+1

Bueno, eso no ayudó directamente, pero sí me recordó que PLINQO tiene un método OnLoaded que puedo usar. Todavía no es perfecto, pero puede superar mi problema actual. –

0

Usted está definitivamente no obligados a utilizar el valor predeterminado EntitySet<> pero puede utilizar cualquier <> colección IList lugar. Reflexioné un poco sobre EntitySet <> pero no encontré ningún enlace en el método Load(), que implementa la enumeración de la fuente diferida del conjunto de entidades (es donde realmente se consulta y materializa el EntitySet).

Linq To SQL usará el método Assign() para asignar una fuente IEnumerable (que es floja de forma predeterminada) a su colección. A partir de allí, puede implementar su propio EntitySet de carga lenta con un gancho personalizado en el punto donde primero enumera la colección de origen (ejecutar la consulta).

Cuestiones relacionadas