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

Muito obriado pela explicação, ajudou demais!