tutorial - visual c# entity framework
O LINQ To Entities não reconhece o método Last. Mesmo? (4)
Nesta consulta:
public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
var context = DataContext.GetDataContext();
return context.ServerOnlineCharacters
.OrderBy(p => p.ServerStatus.ServerDateTime)
.GroupBy(p => p.RawName)
.Select(p => p.Last());
}
Eu tive que mudar isso para isso funcionar
public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
var context = DataContext.GetDataContext();
return context.ServerOnlineCharacters
.OrderByDescending(p => p.ServerStatus.ServerDateTime)
.GroupBy(p => p.RawName)
.Select(p => p.FirstOrDefault());
}
Eu não poderia nem usar p.First()
, para espelhar a primeira consulta.
Por que existem tais limitações básicas no que é um sistema ORM tão robusto?
Ainda outra maneira obter último elemento sem OrderByDescending e carregar todas as entidades:
dbSet
.Where(f => f.Id == dbSet.Max(f2 => f2.Id))
.FirstOrDefault();
Em vez de Last()
, tente isto:
model.OrderByDescending(o => o.Id).FirstOrDefault();
Isso porque LINQ to Entities (e bancos de dados em geral) não oferece suporte a todos os métodos LINQ (veja aqui para detalhes: http://msdn.microsoft.com/en-us/library/bb738550.aspx )
O que você precisa aqui é pedir seus dados de tal forma que o "último" registro se torne "primeiro" e então você pode usar FirstOrDefault. Note que os bancos de dados geralmente não possuem conceitos como "primeiro" e "último", não é como se o último registro inserido fosse "último" na tabela.
Este método pode resolver seu problema
db.databaseTable.OrderByDescending(obj => obj.Id).FirstOrDefault();
Substitua Last()
por um seletor Linq OrderByDescending(x => x.ID).Take(1).Single()
Algo como isso seria trabalhoso se você preferir fazer isso no Linq:
public static IEnumerable<IServerOnlineCharacter> GetUpdated()
{
var context = DataContext.GetDataContext();
return context.ServerOnlineCharacters.OrderBy(p => p.ServerStatus.ServerDateTime).GroupBy(p => p.RawName).Select(p => p.OrderByDescending(x => x.Id).Take(1).Single());
}