Tengo una lista: usuarios de la colección que tienen alrededor de 100K + registros de usuarios (todos los objetos de usuario completamente cargados de la base de datos con campos como Bio, Nombre, Apellido, etc.). Esta colección se obtiene al iniciar la aplicación desde la base de datos y se guarda en la memoria.Rendimiento de Linq para la colección en memoria
entonces he código como:
User cachedUser = users.FirstOrDefault(x => string.Equals(x.UserName, username,
StringComparison.CurrentCultureIgnoreCase));
que utilizo a buscar a los usuarios de esta colección. Pero de alguna manera noté que esta operación es increíblemente lenta. ¿Hay algún problema de rendimiento al usar Linq para consultar en la colección de memoria de objetos grandes? ¿Debería llamar al DB cada vez que quiero obtener un usuario?
Usted entiende que 'FirstOrDefault' es O (n), ¿verdad? Si tiene una colección muy grande, revisar cada elemento uno por uno llevará algo de tiempo. (y los dbs generalmente están indexados). Hay una variedad de formas de acelerar esto, una de las cuales es simplemente lanzarlo a un diccionario. ¿Hay alguna razón por la que no estás haciendo eso? –
Quiero almacenar en caché todos los usuarios pensando que sería mejor por motivos de rendimiento, ya que se llama al método GetUser() en casi todas las páginas de mi aplicación. Si uso un diccionario, ¿será mucho más rápido? Es el diccionario O (1)? ¿O necesito ordenar primero mi dictionaory? –
¿Solo necesita almacenar en caché al usuario actual? Solo puede usar el objeto incorporado 'Session' o' Cache' para eso. –