Aqui está uma visão geral dos diferentes métodos:
Find () - quando você deseja obter um item pela chave primária. Isso retornará nulo se não puder encontrar um item. Ele examinará o contexto antes de ir para o banco de dados (conforme apontado por Yaron nos comentários), o que pode ser um fator de eficiência importante se você precisar obter a mesma entidade várias vezes enquanto o mesmo contexto estiver ativo.
Single () - quando você espera que exatamente um item seja retornado por uma consulta. Isso lançará uma exceção se a consulta não retornar exatamente um item.
SingleOrDefault () - quando você espera que zero ou um item seja retornado por uma consulta (ou seja, você não tem certeza se existe um item com uma determinada chave). Isso lançará uma exceção se a consulta não retornar zero ou um item.
First () - quando você espera que um ou mais itens sejam retornados por uma consulta, mas deseja acessar apenas o primeiro item em seu código (a ordem pode ser importante na consulta aqui). Isso lançará uma exceção se a consulta não retornar pelo menos um item.
FirstOrDefault () - quando você espera que zero ou mais itens sejam retornados por uma consulta, mas você deseja acessar apenas o primeiro item em seu código (ou seja, você não tem certeza se existe um item com uma determinada chave)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
ouSingleOrDefault
consultará 2 registros (limite 2) enquantoFirst
ouFirstOrDefault
consultará 1 (limite 1).Eu sempre costumo usar
FirstOrDefault
. Se você realmente deseja ser exigente com o desempenho, deve usarFirstOrDefault
no EF. Under the coversSingleOrDefault
usa top (2) na consulta porque, ele precisa verificar se há uma segunda linha que corresponde aos critérios e, se isso acontecer, ele lança uma exceção. Basicamente,SingleOrDefault
você está dizendo que deseja lançar uma exceção se sua consulta retornar mais de 1 registro.fonte
FirstOrDefault
eSingleOrDefault
para ser significativa? Eu diria que é uma otimização prematura na maioria dos casos.Single()
ouSingleOrDefault()
quando devolvo algo do qual deveria existir apenas um . A razão de eu fazer isso é para detectar bugs fazendo consultas mal escritas, que retornam mais do que deveriam, falham. Pelo menos na minha opinião, isso ajudará a manter os dados do sistema consistentes. Claro que isso é mais lento, mas acho que não é muito mais lento, e estou disposto a pagar esse preço.É realmente muito simples:
Single
retorna um único item e lança uma exceção se não houver nenhum ou mais de um item.First
devolverá o primeiro item ou jogará quando não houver item.FirstOrDefault
irá retornar o primeiro item ou retornar o valor padrão (que énull
no caso de o tipo fornecido ser um tipo de referência) quando não houver item.Este é o comportamento que a API deve ter. Observe, entretanto, que a implementação subjacente pode ter um comportamento diferente. Embora o Entity Framework obedeça a isso, um O / RM como LLBLGen também pode retornar
null
ao chamar, oFirst
que é uma coisa muito estranha. Esta foi uma decisão muito estranha (e teimosa) do designer IMO.fonte
Single
expressa claramente que você espera que o resultado tenha apenas um elemento.Cada um dos quatro métodos tem seu lugar; Embora você realmente tenha apenas duas operações diferentes.
A versão xxxxOrDefault () apenas adiciona "Não quero considerar um conjunto de resultados vazio uma circunstância excepcional."
fonte
Por outro lado, você pode dividir esses métodos pela lógica central, assim:
Para alguns detalhes de desempenho, especialmente no segundo caso, você pode olhar aqui: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
Além disso, no primeiro grupo você pode definir consultas complexas, mas com o método Find () você pode fornecer apenas a chave de entidade para pesquisa.
fonte
Single () e SingleOrDefault () são normalmente usados em identificadores únicos, como IDs, enquanto First () ou FirstOrDefault () geralmente são usados para uma consulta que pode ter vários resultados, mas você deseja apenas o "Top 1" .
Single () ou First () lançaria uma exceção se nenhum resultado fosse retornado, SingleOrDefault () e FirstOrDefault () capturariam a exceção e retornaria nulo ou padrão (ResultDataType).
fonte