Qual é a melhor maneira de verificar se um objeto existe no banco de dados do ponto de vista de desempenho? Estou usando o Entity Framework 1.0 (ASP.NET 3.5 SP1).
114
Qual é a melhor maneira de verificar se um objeto existe no banco de dados do ponto de vista de desempenho? Estou usando o Entity Framework 1.0 (ASP.NET 3.5 SP1).
Se você não deseja executar SQL diretamente, a melhor maneira é usar Any () . Isso ocorre porque Any () retornará assim que encontrar uma correspondência. Outra opção é Count () , mas pode ser necessário verificar todas as linhas antes de retornar.
Aqui está um exemplo de como usá-lo:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
E em vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
a uma interface que éIEnumerable
e retornar objetos que contêm umId
, você deve ser capaz de usar sua função genéricaIsExists<T>()
.Do ponto de vista do desempenho, acho que uma consulta SQL direta usando o comando EXISTS seria apropriada. Veja aqui como executar SQL diretamente no Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
fonte
Tive que gerenciar um cenário em que a porcentagem de duplicatas fornecidas nos novos registros de dados era muito alta, e tantos milhares de chamadas de banco de dados estavam sendo feitas para verificar a existência de duplicatas (portanto, a CPU enviava muito tempo a 100%). No final, decidi manter os últimos 100.000 registros em cache na memória. Dessa forma, eu poderia verificar se há duplicatas nos registros armazenados em cache, o que era extremamente rápido quando comparado a uma consulta LINQ no banco de dados SQL e, em seguida, gravar quaisquer registros genuinamente novos no banco de dados (bem como adicioná-los ao cache de dados, o que também classificados e aparados para manter seu comprimento gerenciável).
Observe que os dados brutos eram um arquivo CSV que continha muitos registros individuais que precisavam ser analisados. Os registros em cada arquivo consecutivo (que chegavam a uma taxa de cerca de 1 a cada 5 minutos) se sobrepunham consideravelmente, daí a alta porcentagem de duplicatas.
Em suma, se você tiver dados brutos com carimbo de data / hora chegando, praticamente em ordem, usar um cache de memória pode ajudar na verificação de duplicação de registros.
fonte
Eu sei que este é um tópico muito antigo, mas apenas no caso de alguém como eu precisa desta solução, mas em VB.NET aqui está o que usei com base nas respostas acima.
fonte
Eu tive alguns problemas com isso - minha EntityKey consiste em três propriedades (PK com 3 colunas) e eu não queria verificar cada uma das colunas porque isso seria feio. Pensei em uma solução que funcionasse o tempo todo com todas as entidades.
Outra razão para isso é que eu não gosto de capturar UpdateExceptions todas as vezes.
Um pouco de reflexão é necessário para obter os valores das propriedades-chave.
O código é implementado como uma extensão para simplificar o uso como:
Dar uma olhada:
fonte
Acabei de verificar se o objeto é nulo, funciona 100% para mim
fonte
Por que não fazer?
fonte
Melhor maneira de fazer isso
Independentemente de qual seja o seu objeto e de qual tabela no banco de dados, a única coisa que você precisa é a chave primária no objeto.
Código C #
Código VB.NET
fonte