Executando verificação de segurança...
1

Qual a diferença entre FirstOrDefault e FindAsync ?

Estou desenvolvendo uma API em C# + ASPNET e me deparei com alguns soluções diferentes para procura por um modelo no banco pelo ID.

Com o FirstOrDefault:

_context.Playlists.FirstOrDefault(x => x.Id == id);

E com o FindAsync:

await _context.Playlists.FindAsync(id);

Ou:

await _context.Playlists.FirstOrDefaultAsync(x => x.Id == Id);

O que seria mais indicado para este caso ?

Carregando publicação patrocinada...
2
  • FirstOrDefault:

    • Pode ser usado com EF Core, ou em coleção em memoria, faz a busca no banco ou na coleção, caso não encontre retorna null
    • Vc pode passar um valor default caso deseje
      • _context.Playlists.FirstOrDefault(x => x.Id == id, new Playlist());
  • First

    • Comportamento semelhante o FirstOrDefault, entretanto lança um exception caso não encontrado
  • Find

    • Pode ser usado com ef core, ou em coleção em memoria
    • Vc para um params object?[]? keyValues de chaves primarias
    • Primeiro busca nos itens já trackeados e retorna sem fazer busca ao banco de dados, caso não encontre faz a busca, caso não encontre na busca retora null
      - change-tracking
      - querying tracking
  • FirstOrDefaultAsync ou FindAsync

  • Normalmente uso o assíncrono para fazer busca e persistencias e síncrono quando ocorre apenas trackeamento, ex:

    • await _context.Playlists.ToListAsync()
    • await _context.Playlists.FirstOrDefaultAsync();
    • _context.Playlists.Add(...)
    • _context.Playlists.Delete(...)
    • await _context.SaveChangesAsync();
1
1

Segundo a documentação:

FirstOrDefault: Retorna o primeiro elemento da sequência que atende a uma condição ou um valor padrão especificado se nenhum elemento desse tipo for encontrado.

https://learn.microsoft.com/pt-br/dotnet/api/system.linq.enumerable.firstordefault?view=net-8.0


**FirstOrDefaultAsync:**Retorna de forma assíncrona o primeiro elemento de uma sequência ou um valor padrão se a sequência não contiver elementos.

https://learn.microsoft.com/pt-br/dotnet/api/system.data.entity.queryableextensions.firstordefaultasync?view=entity-framework-6.2.0

A diferença entre FirstOrDefault e FirstOrDefaultAsync está basicamente no retorno, pois FirstOrDefaultAsync retornará uma task por ser assincrono.


FindAsync: Localiza de forma assíncrona uma entidade com os valores de chave primária fornecidos. Se houver uma entidade com os valores de chave primária fornecidos no contexto, ela será retornada imediatamente sem fazer uma solicitação ao repositório. Caso contrário, uma solicitação será feita ao repositório para uma entidade com os valores de chave primária fornecidos e essa entidade, se encontrada, será anexada ao contexto e retornada. Se nenhuma entidade for encontrada no contexto ou no repositório, será retornado nulo.

https://learn.microsoft.com/pt-br/dotnet/api/system.data.entity.dbset.findasync?view=entity-framework-6.2.0


Sobre qual seria mais indicado, vai depender do contexto do seu problema, caso você queira encontrar apenas o primeiro item de uma consulta, use o FirstOrDefault, se precisar mais de um item use o Find. Leve em consideração a necessidade de usar uma função assíncrona como o FindAsync ou FirstOrDefaultAsync.

0