Optimisation d'une requête LINQ to SQL
-
09-06-2019 - |
Question
J'ai une requête qui ressemble à ceci :
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();
}
Je dois imprimer les informations de la commande et l'utilisateur qui l'a créée :
foreach (var o in FetchLatestOrders(0, 10))
{
Console.WriteLine("{0} {1}", o.Code, o.Customer.Name);
}
Cela 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 rassemble les commandes et son client dans une seule requête SQL ?
Merci
MISE À JOUR :Par suggestion de Sirrocco, j'ai modifié 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.
La solution
Une autre chose que vous pouvez faire est EagerLoading.Dans Linq2SQL, vous pouvez utiliser LoadOptions : En savoir plus sur les options de chargementUne chose TRÈS étrange à propos de L2S est que vous pouvez définir LoadOptions uniquement avant que la première requête ne soit envoyée à la base de données.
Autres conseils
vous voudrez peut-être envisager d'utiliser des requêtes compilées
jettes un coup d'oeil à http://www.3devs.com/?p=3