Question

Je cache tout un tas de métadonnées statiques dans mon application au démarrage. C'est à partir d'une base de données et il y a des tonnes de relations de clés étrangères. Je regarde la meilleure façon de les modéliser. Je viens de commencer avec Linq.

C'est facile pour moi de déclarer une classe

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();
...

(J'utilise subsonic 3 pour générer mes cours, mais c'est à côté du point). Alors je peux utiliser l'iQueryable<T> Membres pour avoir accès à tout ce que je veux, par exemple:

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

Avant d'utiliser iQueryable, j'utilisais des dictionnaires pour stocker les relations FK, donc pour imiter le code ci-dessus, je coderais ce qui suit d'une liste préexistante<libm_ColType> lister

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

Et puis je pourrais utiliser

libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];

Ok, donc enfin nous arrivons à la question!

La recherche de dictionnaire par ID est extrêmement efficace, mais la solution iQueryable est beaucoup plus flexible et élégante.

Je me demande combien de performances je vais utiliser iQueryable. Je soupçonne que je fais une analyse linéaire de la liste chaque fois que je l'appelle, et cela va vraiment additionner les appels répétés s'il y a beaucoup d'enregistrements impliqués. Ce serait formidable si je pouvais identifier des colonnes à valeur unique et avoir un hachage généré et mis en cache après la première recherche, mais je soupçonne que cela ne fera pas partie de l'offre.

C'est un peu un dealbreaker pour moi concernant l'utilisation de Linq.

Remarque (je vais le répéter) que je ne tire pas les données d'une base de données, c'est déjà en mémoire et je l'interroge là-bas, donc je ne suis intéressant que de rechercher l'iQuery en mémoire<T>.

Était-ce utile?

La solution

IQueryable représente une collection dans un magasin de données, donc vous ne le faites pas avoir les collections en mémoire. Si vous voulez explicitement des collections en mémoire, je reviendrais à vos dictionnaires. N'oubliez pas que cela ne vous empêche pas d'utiliser les requêtes LINQ sur les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top