2008-09-08 8 views
7

J'ai une requête qui ressemble à ceci:Optimisation d'une requête 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(); 
} 

J'ai besoin d'imprimer les informations de l'ordre et l'utilisateur qui l'a créé:

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

Ce produit une requête SQL pour amener les commandes et une requête pour chaque commande pour amener le client. Est-il possible d'optimiser la requête pour qu'elle apporte les commandes et son client dans une requête SQL?

Merci

UDPATE: Par suggestion Sirrocco j'ai changé la requête comme ceci et cela fonctionne. Une seule requête de sélection est générée:

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(); 
    } 
} 

Merci sirrocco.

Répondre

4

Quelque chose que vous pouvez faire est EagerLoading. Dans Linq2SQL, vous pouvez utiliser LoadOptions: More on LoadOptions Une chose très étrange à propos de L2S est que vous pouvez définir LoadOptions seulement avant que la première requête soit envoyée à la base de données.

+0

Wow, c'était génial. J'ai mis en œuvre ceci et le temps de requête réduit de 25 secondes à 1,5 .. grande info merci. – BastanteCaro

+0

Pourriez-vous s'il vous plaît répondre http://stackoverflow.com/questions/11262785/optimizing-repositorys-submitchanges-method? – Lijo