¿Cuál es la mejor forma de comprobar si un objeto existe en la base de datos desde el punto de vista del rendimiento? Estoy usando Entity Framework 1.0 (ASP.NET 3.5 SP1).
114
¿Cuál es la mejor forma de comprobar si un objeto existe en la base de datos desde el punto de vista del rendimiento? Estoy usando Entity Framework 1.0 (ASP.NET 3.5 SP1).
Si no desea ejecutar SQL directamente, la mejor manera es usar Any () . Esto se debe a que Any () regresará tan pronto como encuentre una coincidencia. Otra opción es Count () , pero es posible que deba verificar cada fila antes de regresar.
Aquí hay un ejemplo de cómo usarlo:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Y en vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
a una interfaz que esIEnumerable
y devuelve objetos que contienen unId
, debería poder usar su función genéricaIsExists<T>()
.Desde el punto de vista del rendimiento, supongo que una consulta SQL directa utilizando el comando EXISTS sería apropiada. Vea aquí cómo ejecutar SQL directamente en Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
fuente
Tuve que administrar un escenario en el que el porcentaje de duplicados que se proporcionaban en los nuevos registros de datos era muy alto y se estaban realizando miles de llamadas a la base de datos para verificar si había duplicados (por lo que la CPU envió mucho tiempo al 100%). Al final, decidí mantener los últimos 100.000 registros en caché en la memoria. De esta manera, pude verificar si hay duplicados en los registros en caché, lo cual fue extremadamente rápido en comparación con una consulta LINQ en la base de datos SQL, y luego escribir cualquier registro genuinamente nuevo en la base de datos (así como agregarlos a la caché de datos, que también ordenados y recortados para mantener su longitud manejable).
Tenga en cuenta que los datos sin procesar eran un archivo CSV que contenía muchos registros individuales que debían analizarse. Los registros en cada archivo consecutivo (que llegó a una velocidad de aproximadamente 1 cada 5 minutos) se superpusieron considerablemente, de ahí el alto porcentaje de duplicados.
En resumen, si ingresa datos sin procesar con marca de tiempo, prácticamente en orden, entonces el uso de una memoria caché podría ayudar con la verificación de duplicación de registros.
fuente
Sé que este es un hilo muy antiguo, pero en caso de que alguien como yo necesite esta solución, pero en VB.NET esto es lo que usé en base a las respuestas anteriores.
fuente
Tuve algunos problemas con esto: mi EntityKey consta de tres propiedades (PK con 3 columnas) y no quería verificar cada una de las columnas porque eso sería feo. Pensé en una solución que funcione todo el tiempo con todas las entidades.
Otra razón para esto es que no me gusta detectar UpdateExceptions cada vez.
Se necesita un poco de reflexión para obtener los valores de las propiedades clave.
El código se implementa como una extensión para simplificar el uso como:
Echar un vistazo:
fuente
Solo verifico si el objeto es nulo, funciona al 100% para mí
fuente
¿Por qué no hacerlo?
fuente
La mejor manera de hacerlo
Independientemente de cuál sea su objeto y para qué tabla en la base de datos, lo único que necesita es tener la clave principal en el objeto.
Código C #
Código VB.NET
fuente