0

C'est ma requête:Besoin d'aide à la conception d'une requête dans ELinq

Dim vendorId = 1, categoryId = 1 
Dim styles = From style In My.Context.Styles.Include("Vendor") _ 
      Where style.Vendor.VendorId = vendorId _ 
      AndAlso (From si In style.StyleItems _ 
         Where si.Item.Group.Category.CategoryId = _ 
          categoryId).Count > 0 _ 
      Distinct 

J'ai le sentiment que je peux améliorer les performances, cuz la requête ci-dessus est (corrigez-moi si je me trompe) effectue 2 tour -trips vers le serveur; 1 fois par le comte et ensuite quand il est exécuté. Je veux envoyer cette chose de compte à la base de données de sorte qu'il ne devrait être qu'un aller-retour sur le serveur.

Même ce n'est pas la chose exacte, c'est en fait ce que je dois:

SELECT DISTINCT Style.* 
FROM Style INNER JOIN 
    Vendor ON Style.VendorId = Vendor.VendorId INNER JOIN 
    StyleItem ON Style.StyleId = StyleItem.StyleId INNER JOIN 
    Item ON StyleItem.ItemId = Item.ItemId INNER JOIN 
    [Group] ON Item.GroupId = [Group].GroupId INNER JOIN 
    Category ON [Group].CategoryId = Category.CategoryId 
WHERE (Style.VendorId = @vendorid) AND (Category.CategoryId = @CategoryId) 

Je voudrais pouvoir utiliser cette procédure stockée (c.-à-fonction d'importation, etc.), mais je dois Include("Vendor"), ce qui me contraintes pour le faire avec Linq.

Toutes sortes de suggestions seront vraiment bien accueillies!

+0

Je ne suis pas sûr qu'il va frapper deux fois, si cela peut être une requête SQL "unique", alors il devrait probablement traduire - question intéressante cependant. Vous devriez être capable de regarder le SQL qu'il envoie (si je savais à quel point j'avais une réponse!). – Murph

Répondre

1

Il ne fait probablement pas deux voyages dans la base de données. Il sera optimisé avant d'être exécuté, et rien ne sera exécuté tant que vous n'aurez pas essayé de lire les données.

Normalement, je vérifie le SQL qui est créé en utilisant SQL Profiler. J'ai également trouvé LinqPad très utile.