Como eu faço isso
Select top 10 Foo from MyTable
no Linq para SQL?
Como eu faço isso
Select top 10 Foo from MyTable
no Linq para SQL?
Respostas:
No VB:
from m in MyTable
take 10
select m.Foo
Isso pressupõe que MyTable implementa IQueryable. Pode ser necessário acessá-lo por meio de um DataContext ou de outro provedor.
Ele também assume que Foo é uma coluna no MyTable que é mapeada para um nome de propriedade.
Consulte http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx para obter mais detalhes.
Use o método Take :
var foo = (from t in MyTable
select t.Foo).Take(10);
No VB, o LINQ tem uma expressão take:
Dim foo = From t in MyTable _
Take 10 _
Select t.Foo
A partir da documentação:
Take<TSource>
enumerasource
e produz elementos até que oscount
elementos tenham sido produzidos ou quesource
não contenham mais elementos. Secount
exceder o número de elementos emsource
, todos os elementos desource
são retornados.
@ Janei: meu primeiro comentário aqui é sobre sua amostra;)
Eu acho que se você gosta disso, você quer pegar 4 e aplicar o tipo nesses 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 do que ordenar tbl_News inteiro por idNews descendente e depois levar 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ão ? os resultados podem ser diferentes.
Eu faço assim:
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
};
Se a tomada acontece no cliente ou no banco de dados depende de onde você aplica o operador de tomada. Se você aplicá-lo antes de enumerar a consulta (ou seja, antes de usá-lo em um foreach ou convertê-lo em uma coleção), a tomada resultará no envio do operador "top n" SQL ao banco de dados. Você pode ver isso se executar o SQL Profiler. Se você aplicar a tomada após enumerar a consulta, ela ocorrerá no cliente, pois o LINQ terá que recuperar os dados do banco de dados para que você possa enumerá-la.
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();
Eu tive que usar o método Take (n), em seguida, transformar em lista, funcionou como um encanto:
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();
Dessa forma, funcionou para mim:
var noticias = from n in db.Noticias.Take(6)
where n.Atv == 1
orderby n.DatHorLan descending
select n;
Para limit 1
métodos de uso FirstOrDefault()
ou First()
.
Exemplo
var y = (from x in q select x).FirstOrDefault();