2009-09-16 6 views
2
Dim query = (From p in Parent _ 
      select _ 
       p.ID, _ 
       Tags = String.Join("|", p.Child.Select(Function(c) c.Tag.TagName).ToArray)).Take(100) 

Dans la requête ci-dessus, lorsque vous utilisez prendre pour limiter les lignes renvoyées, une requête SQL distincte est exécutée pour chaque ligne de retourner le champ 'Balises. Si je supprime Take (100), une seule requête à envoyer à SQL Server. Alors, comment limiter le nombre de lignes renvoyées, tout en empêchant l'exécution d'une nouvelle sous-requête pour chaque ligne?LinqToSql - Prévenir les sous requêtes lorsque limitant nombre de lignes retournées

Répondre

2

Edit2 Lorsque vous travaillez avec des types imbriqués, ce faisant nouveau {r, r.childrenCollection}, LINQ traduit cela (SELECT TOP 100 DE r), la suppression de la jointure des informations. Lorsque vous faites une jointure par vous-même, cela n'arrive pas. Donc quelque chose comme:

 var thingyWithChilds 
      = (from p in dc.RightCategories 
       join r in dc.Rights on p.Id equals r.CategoryId 
       select new { p.Id, r }); 

     var bla = thingyWithChilds.Take(100); 

ne causera pas le même problème.

autres choses qui pourraient appliquer

Vous faites ToArray() qui provoque la requête à exécuter car il est pas un IQueryable. Faites simplement ToArray() après avoir pris Take().

modifier Selon ce sujet SO: Is there a LINQ equivalent of string.Join(string, string[]), il est possible d'utiliser ni String.Join si vous voulez tout faire sur le serveur, car il n'y a pas de commande SQL disponible pour le faire dans TSQL.

+0

Pourquoi cela fonctionne-t-il sans Take()? Si je remplace Take avec ToList() pour exécuter la requête, une seule requête SQL est générée! –

+0

Parce que Take est une action supplémentaire qui doit être effectuée sur le serveur SQL. query-thats-already-partial-execute.ToList(). Take (100), va générer 1 requête; query-thats-already-partial-execute.Take (100) .ToList() générera des requêtes supplémentaires. –

+0

D'accord, mais il semble toujours qu'il n'y a aucun moyen de résoudre ma question initiale. Même en supprimant toArray (par exemple, en changeant simplement en p.Child), vous obtenez le même comportement. –

Questions connexes