2008-10-10 28 views

Respuesta

134

En VB:

from m in MyTable 
take 10 
select m.Foo 

Esto supone que implementa MiTabla IQueryable. Es posible que deba acceder a través de un DataContext u otro proveedor.

También asume que Foo es una columna en MyTable que se asigna a un nombre de propiedad.

Consulte http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx para obtener más información.

+121

que no funciona en C#, no hay ninguna toma de expresión. Debe usar el método Take(). –

+9

Técnicamente, el interrogador solicitó Linq a SQL, por lo que VB es una suposición viable. Dicho esto, ALassek, soy un chico C# y prefiero tu respuesta. :-) –

+3

Bueno, tu ejemplo está escrito en C# LINQ y es por eso que lo mencioné. –

3

Utilizaría el método Take (N).

231

Uso del Take method:

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

En VB LINQ tiene una expresión toma:

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

De la documentación:

Take<TSource> enumera source y produce elementos hasta count elementos tienen cedido o source c ontains no más elementos. Si count excede la cantidad de elementos en source, se devuelven todos los elementos de source.

+12

Las pequeñas diferencias en LINQ entre C# y VB son molestas. ¿Por qué C no tiene una expresión de toma como VB? Eso parece un descuido. Y la falta de Subs anónimos de VB hace que las lambdas sean mucho menos útiles. –

+0

Justo lo que estaba buscando +1 – jasonco

+1

+1 Justo lo que necesitaba, también. Y FWIW, parece que solo los diez discos realmente bajan de la tubería. Mi SELECT devolvería de lo contrario una cantidad de datos enorme, suficiente para arrojar una * OutOfMemoryException * después de un doloroso retraso. Con Take (_manageable-quantity_), sin demora, sin excepción. –

32

Utilice la Take(int n) método:

var q = query.Take(10); 
4

Esto funciona bien en C#

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

me gusta esto:

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 
       }; 
+5

El problema con este enfoque es que tomará 4 y luego los ordenará, cuando sospecho que lo que realmente desea es obtener los 4 mejores resultados. Tienes que hacer la toma después del pedido, ver comentario de Yanns. –

1

Tomando los datos de base de datos sin clasificar es la igual que la toma aleatoria

13

@Janei: mi primer comentario aquí se trata de la muestra;)

Creo que si lo hace así, usted quiere tomar 4, a continuación, aplicar el tipo de éstos 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 
       }; 

diferente a la clasificación tbl_News enteros por idNews descendente y luego tomar 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); 

no? los resultados pueden ser diferentes

2

Si la toma ocurre en el cliente o en la base de datos depende de dónde aplique el operador de toma. Si lo aplica antes de enumerar la consulta (es decirantes de usarlo en un foreach o convertirlo en una colección), la toma dará como resultado que el operador SQL "n superior" se envíe a la base de datos. Puede ver esto si ejecuta el generador de perfiles SQL. Si se aplica la toma después de enumerar la consulta que va a pasar en el cliente, como LINQ se habrá tenido que recuperar los datos de la base de datos para que usted pueda enumerar a través de ella

2
Array oList = ((from m in dc.Reviews 
          join n in dc.Users on m.authorID equals n.userID 
          orderby m.createdDate descending 
          where m.foodID == _id      
          select new 
          { 
           authorID = m.authorID, 
           createdDate = m.createdDate, 
           review = m.review1, 
           author = n.username, 
           profileImgUrl = n.profileImgUrl 
          }).Take(2)).ToArray(); 
0

tuve MÉTODO Se da (n) a utilizar , luego transformar a la lista, Funcionó como un amuleto:

var listTest = (from x in table1 
        join y in table2 
        on x.field1 equals y.field1 
        orderby x.id descending 
        select new tempList() 
        { 
         field1 = y.field1, 
         active = x.active 
        }).Take(10).ToList(); 
10

El OP también mencionó el desplazamiento, así que por ej. si desea obtener los artículos del 30 al 60, lo haría:

var foo = (From t In MyTable 
     Select t.Foo).Skip(30).Take(30); 

Utilice el método "Omitir" para el desplazamiento.
Utilice el método "Tomar" para el límite.

0

De esta manera funcionó para mí:

var noticias = from n in db.Noticias.Take(6) 
         where n.Atv == 1 
         orderby n.DatHorLan descending 
         select n; 
+0

Acabo de editar su publicación, he traducido el texto en portugués al inglés, porque este sitio es solo en inglés (no se aplica a nombres de variables, por eso no los cambié). – waka

+0

¡Lo siento! No me di cuenta, pensé que estaba en el stackoverflow brasileño. Lo siento – Gladson

Cuestiones relacionadas