¿Cómo hacer esto¿Cuál es el valor de Linq a SQL equivalente a TOP o LIMIT/OFFSET?
Select top 10 Foo from MyTable
en LINQ to SQL?
¿Cómo hacer esto¿Cuál es el valor de Linq a SQL equivalente a TOP o LIMIT/OFFSET?
Select top 10 Foo from MyTable
en LINQ to SQL?
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.
Utilizaría el método Take (N).
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>
enumerasource
y produce elementos hastacount
elementos tienen cedido osource
c ontains no más elementos. Sicount
excede la cantidad de elementos ensource
, se devuelven todos los elementos desource
.
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. –
Justo lo que estaba buscando +1 – jasonco
+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. –
Utilice la Take(int n)
método:
var q = query.Take(10);
Esto funciona bien en C#
var q = from m in MyTable.Take(10)
select m.Foo
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
};
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. –
Tomando los datos de base de datos sin clasificar es la igual que la toma aleatoria
@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
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
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();
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();
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.
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;
que no funciona en C#, no hay ninguna toma de expresión. Debe usar el método Take(). –
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. :-) –
Bueno, tu ejemplo está escrito en C# LINQ y es por eso que lo mencioné. –