2010-05-22 9 views
20

cuál es la diferencia entre loadwith y associatewith. De los artículos que leí parece que loadwith se utiliza para cargar datos de adición (por ejemplo, todas las órdenes para los clientes). Mientras que AssociateWith se utiliza para filtrar datos.linq a sql loadwith vs associatewith

¿Es eso una correcta comprensión? También será bueno si alguien puede explicar esto con una explicación basada en ejemplos.

Respuesta

30

LoadWith se utiliza para realizar una carga ansiosos de una asociación en contraposición a la forma predeterminada carga perezoso.

Normalmente, las asociaciones se cargan la primera vez que las referencia. Eso significa que si selecciona 100 Order instancias y luego hace algo con cada uno de sus Details, en realidad está realizando 101 SELECT operaciones en la base de datos. Por otro lado, si el LoadOptions especifica LoadWith<Order>(o => o.Details), entonces todo se hace en un solo SELECT con un JOIN agregado.

AssociateWith no tiene ningún efecto sobre cuando se carga la asociación, simplemente lo que se carga. Agrega una cláusula WHERE cada vez que carga una asociación.

Como dices, AssociateWith se utiliza para automáticamente datos de filtro. Normalmente, usaría esto si sabe que una asociación tiene una gran cantidad de elementos y solo necesita un subconjunto específico de ellos. Una vez más, es principalmente una optimización del rendimiento, solo un tipo diferente.

+6

Esta línea dejó en claro para mí "AsociarWith no tiene ningún efecto sobre cuándo se carga la asociación, solo lo que está cargado". Gracias. – stackoverflowuser

7

Sí, su comprensión es correcta; AssociateWith filtra los datos antes de las consultas, mientras que LoadWith devuelve los objetos asociados en la consulta. La razón para hacer LoadWith es para que pueda devolver objetos asociados en 1 sola consulta. De lo contrario, se realizarán llamadas db adicionales en el momento en que itere sobre sus objetos asociados.

Pruebe diferentes ejemplos usted mismo y eche un vistazo al SQL generado a través de Profiler o algún otro registrador. Recuerde que estas opciones deben establecerse en su DataContext antes de realizar cualquier consulta.

Eche un vistazo a los ejemplos en los enlaces a continuación (MSDN). Acabo de copiar los ejemplos que usan allí.

LoadWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo; 

var londonCustomers = from cust in db.Customers 
         where cust.City == "London" 
         select cust; 

AssociateWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.AssociateWith<Customer>(
    c => c.Orders.Where(p => p.ShippedDate != DateTime.Today)); 
db.LoadOptions = dlo; 

var custOrderQuery = from cust in db.Customers 
        where cust.City == "London" 
        select cust;