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());
}






orm