Pregunta

Estoy almacenando en caché una gran cantidad de metadatos estáticos en mi aplicación al inicio.Es de una base de datos y hay toneladas de relaciones de clave externa.Estoy buscando la mejor manera de modelarlos.Acabo de empezar con LINQ.

Es fácil para mí declarar una clase.

public class AllData {
    public static IQueryable<libm_ColPurpose> IQ_libm_ColPurpose = libm_ColPurpose.All();
    public static IQueryable<libm_ColType> IQ_libm_ColType = libm_ColType.All();
...

(Estoy usando SubSonic 3 para generar mis clases, pero eso no viene al caso).Entonces puedo usar IQueryable<T> miembros para tener acceso a cualquier cosa que quiera, por ejemplo:

libm_ColType ct = AllData.IQ_libm_ColType.SingleOrDefault(x => x.ColTypeStr == this.DefaultJetColTypeStr);

Antes de usar IQueryable, estaba usando diccionarios para almacenar relaciones FK, por lo que para imitar el código anterior codificaría lo siguiente a partir de una lista preexistente.<libm_ColType> lista

Dictionary<string, libm_ColType> colTypeByColTypeStr = new Dictionary<string, libm_ColType>();
foreach (libm_ColType x in list) { rtn.Add(x.ColTypeStr, x); }

y luego podría usar

libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];

Bien, ¡finalmente llegamos a la pregunta!

La búsqueda en el diccionario por ID es extremadamente eficiente; sin embargo, la solución IQueryable es mucho más flexible y elegante.

Me pregunto cuánto impacto de rendimiento obtendré al usar IQueryable.Sospecho que estoy haciendo un escaneo lineal de la lista cada vez que la llamo, y eso realmente se sumará a las llamadas repetidas si hay muchos registros involucrados.Sería fantástico si pudiera identificar columnas con valores únicos y generar una tabla hash y almacenarla en caché después de la primera búsqueda, pero sospecho que esto no será parte de la oferta.

Esto es un factor decisivo para mí con respecto al uso de LINQ.

Tenga en cuenta (lo repetiré de nuevo) que NO estoy extrayendo datos de una base de datos, ya están en la memoria y los estoy consultando allí, por lo que solo me interesa buscar el IQueryable en memoria.<T>.

¿Fue útil?

Solución

IQueryable representa una colección en un almacén de datos, por lo que probablemente no tener las colecciones en la memoria.Si desea explícitamente colecciones en memoria, volvería a sus diccionarios.Recuerde, esto no le impide utilizar consultas LINQ sobre los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top