2010-05-05 29 views
6

En .NET 4 y el entorno multinúcleo, ¿aprovecha el objeto linq to sql datacontext los nuevos paralelos si usamos DataLoadOptions.LoadWith?LinqToSql - Paralelo - DataContext y Parallel

EDITAR

sé LINQ a SQL no paralelizar las consultas ordinarias. Lo que quiero saber es cuándo especificamos DataLoadOption.LoadWith, ¿utiliza la paralelización para realizar la coincidencia entre cada entidad y sus subentidades?

Ejemplo:

using(MyDataContext context = new MyDataContext()) 
{ 
    DataLaodOptions options =new DataLoadOptions(); 
    options.LoadWith<Product>(p=>p.Category); 
    return this.DataContext.Products.Where(p=>p.SomeCondition); 
} 

genera el siguiente código SQL:

Select Id,Name from Categories 
Select Id,Name, CategoryId from Products where p.SomeCondition 

cuando se crean todos los productos, vamos a tener una

categories.ToArray(); 
Parallel.Foreach(products, p => 
{ 
    p.Category == categories.FirstOrDefault(c => c.Id == p.CategoryId); 
}); 

o

categories.ToArray(); 
foreach(Product product in products) 
{ 
    product.Category = categories.FirstOrDefault(c => c.Id == product.CategoryId); 
} 

?

+0

No olvide marcar su respuesta favorita ;-) – Steven

+0

@Steven: Esperaba respuestas a mi edición ... – Gregoire

+0

No hay ninguna optimización paralela que haya dentro de L2S. Ver mi actualización – Steven

Respuesta

10

No, LINQ to SQL no. Hay poco para paralelizar en el lado .NET. Todo lo que hace LINQ to SQL es traducir árboles de expresiones a consultas SQL. SQL Server ejecutará esas instrucciones SQL, y puede hacer esto en paralelo.

No se olvide que mientras que usted puede hacer algo como esto con su LINQ a SQL consulta LINQ, no es una buena idea:

// BAD CODE!!! Don't parallelize a LINQ to SQL query 
var q = 
    from customer in db.Customers.AsParallel() 
    where customer.Id == 5 
    select customer; 

Mientras que esto produce los resultados correctos, no lo hará obtener la mejora en el rendimiento que está esperando. PLINQ no puede manejar objetos IQueryable. Por lo tanto, solo manejará un IQueryable como un IEnumerable (iterando así). Procesará la colección db.Customers en paralelo y usará varios hilos para filtrar a los clientes. Si bien esto suena bien, esto significa que recuperará la colección completa de clientes de la base de datos. Sin el constructo AsParallel, LINQ to SQL podría optimizar esta consulta agregando el WHERE id = @ID al SQL. Servidor SQL sería capaz de usar índices (y posiblemente varios subprocesos) para recuperar los valores.

Si bien hay algo de espacio para la optimización dentro del motor LINQ to SQL cuando se trata de unir entidades a sus subentidades, no parece que exista tal optimización en el marco actualmente (o al menos, no pude encuentra cualquier usando Reflector).

+0

Gracias por su respuesta. Sabía esto para este caso específico. Lo que me gustaría saber es qué ocurre cuando se especifican las dataloadoptions? – Gregoire

+0

Lo siento. No estoy seguro de lo que quieres saber. Hasta donde yo sé, LINQ to SQL no hará aceleración interna mediante el uso de construcciones paralelas. Por supuesto, puede hacer su propia optimización paralela en el espacio .NET con PLINQ (a objetos) cuando LINQ to SQL finaliza la búsqueda. – Steven

Cuestiones relacionadas