200 votes

Quel est l'équivalent de Linq to SQL de TOP ou LIMIT/OFFSET?

Comment puis-je faire cela

Sélectionnez les 10 premiers Foo de MaTable

en Linq to SQL?

255voto

Adam Lassek Points 18918

Utilisez la méthode Take:

var foo = (from t in MyTable
           select t.Foo).Take(10);

En VB LINQ, il existe une expression take:

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo

À partir de la documentation:

Take énumère source et retourne des éléments jusqu'à ce que count éléments aient été retournés ou que source ne contienne plus d'éléments. Si count dépasse le nombre d'éléments dans source, tous les éléments de source sont retournés.

16 votes

Les petites différences en LINQ entre C# et VB sont agaçantes. Pourquoi C# n'a-t-il pas une expression take comme VB? Cela semble être un oubli. Et le manque de Subs anonymes en VB rend les lambdas beaucoup moins utiles.

0 votes

Juste ce que je cherchais +1

1 votes

+1 Juste ce dont j'avais besoin, aussi. Et pour ce que ça vaut, il semble que seules les dix premières données soient réellement téléchargées. Sinon, ma requête SELECT retournerait une énorme quantité de données, suffisamment pour provoquer une OutOfMemoryException après un délai douloureux. Avec Take( quantité-gérable ), pas de délai, pas d'exception.

147voto

David Alpert Points 2305

En VB:

from m in MyTable
take 10
select m.Foo

Ceci suppose que MyTable implémente IQueryable. Vous devrez peut-être y accéder via un DataContext ou un autre fournisseur.

Cela suppose également que Foo est une colonne dans MyTable qui est mappée à un nom de propriété.

Consultez http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx pour plus de détails.

132 votes

Cela ne fonctionne pas en C#, il n'y a pas d'expression take. Vous devez utiliser la méthode Take().

11 votes

Techniquement, le questionneur a demandé Linq to SQL, donc VB est une hypothèse viable. Cela dit, ALassek, je suis moi-même un gars en c# et je préfère votre réponse. :-)

3 votes

Eh bien, votre exemple était écrit en C# LINQ, c'est pourquoi je l'ai souligné.

34voto

amcoder Points 614

Utilisez la méthode Take(int n) :

var q = query.Take(10);

14voto

Yann Points 101

@Janei: mon premier commentaire ici concerne votre exemple ;)

Je pense que si vous faites comme ça, vous voulez en prendre 4, puis appliquer le tri sur ces 4.

var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

Différent du tri de toute la tbl_News par idNews décroissant puis en prenant 4

var dados =  (from d in dc.tbl_News
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                }).Take(4);

n'est-ce pas ? Les résultats peuvent être différents.

5voto

spdrcr911 Points 31

Cela fonctionne bien en C#

var q = from m in MyTable.Take(10)
        select m.Foo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X