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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top