2008-09-08 14 views
7

Tengo una consulta que tiene este aspecto:Optimización una consulta LINQ to SQL

public IList<Post> FetchLatestOrders(int pageIndex, int recordCount) 
{ 
    DatabaseDataContext db = new DatabaseDataContext(); 
    return (from o in db.Orders 
      orderby o.CreatedDate descending 
      select o) 
      .Skip(pageIndex * recordCount) 
      .Take(recordCount) 
      .ToList(); 
} 

necesito para imprimir la información de la orden y el usuario que lo creó:

foreach (var o in FetchLatestOrders(0, 10)) 
{ 
    Console.WriteLine("{0} {1}", o.Code, o.Customer.Name); 
} 

Esto produce una consulta SQL para traer los pedidos y una consulta para cada pedido para traer al cliente. ¿Es posible optimizar la consulta para que traiga los pedidos y su cliente en una consulta SQL?

Gracias

UDPATE: Por sugerencia de Sirrocco me cambiaron la consulta como esta y funciona. Solo se genera una consulta de selección:

public IList<Post> FetchLatestOrders(int pageIndex, int recordCount) 
{ 
    var options = new DataLoadOptions(); 
    options.LoadWith<Post>(o => o.Customer); 
    using (var db = new DatabaseDataContext()) 
    { 
     db.LoadOptions = options; 
     return (from o in db.Orders 
       orderby o.CreatedDate descending 
       select o) 
       .Skip(pageIndex * recordCount) 
       .Take(recordCount) 
       .ToList(); 
    } 
} 

Gracias sirrocco.

Respuesta

4

Otra cosa que puede hacer es EagerLoading. En Linq2SQL puede usar LoadOptions: More on LoadOptions Una cosa muy rara acerca de L2S es que puede establecer LoadOptions solo antes de enviar la primera consulta a la base de datos.

+0

Guau, esto fue genial. Implementé esto y el tiempo de consulta se redujo de 25 segundos a 1.5 .. gran información gracias. – BastanteCaro

+0

¿Podría responder http://stackoverflow.com/questions/11262785/optimizing-repositorys-submitchanges-method? – Lijo