Domanda

Sto memorizzando in cache un sacco di metadati statici nella mia app all'avvio. È da un DB e ci sono tonnellate di relazioni chiave straniere. Sto guardando il modo migliore per modellarli. Ho appena iniziato con Linq.

È facile per me dichiarare una 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();
...
.

(sto usando subsonico 3 per generare le mie lezioni, ma questo è accanto al punto). Quindi posso usare i membri iqueryable<T> per accedere a qualsiasi cosa desideri, ad esempio:

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

Prima di utilizzare iQueryable stavo utilizzando i dizionari per memorizzare le relazioni FK, quindi per imitare il codice sopra riportato codificare quanto segue da un preexisting list<libm_ColType> Elenco

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

E poi potrei usare

libm_ColType ct = colTypeByColTypeStr[this.DefaultJetColTypeStr];
.

OK, quindi finalmente arriviamo alla domanda!

Il dizionario Ricerca per ID è estremamente efficiente, tuttavia la soluzione iqueryable è molto più flessibile ed elegante.

Mi chiedo quanto abbia un successo per le prestazioni che ho intenzione di usare iQueryable. Sospetto che sto facendo una scansione lineare della lista ogni volta che lo chiamo, e questo è davvero aggiungere su chiamate ripetute se ci sono molti record coinvolti. Siate grandi se potessi identificare colonne apprezzate uniche e avere un hashtable generato e cached dopo la prima ricerca, ma sospetto che questo non farà parte dell'offerta.

Questo è un po 'di un dealbreaker per me per quanto riguarda l'utilizzo di LINQ.

Nota (lo ripeterò di nuovo) che non sto tirando i dati da un database, è già in memoria e lo sto interrogando lì, quindi sono interessante solo per cercare la memoria IQueryable<T> .

È stato utile?

Soluzione

IQueryable rappresenta una raccolta in un negozio di dati, quindi probabilmente non ha le raccolte in memoria.Se vogliono esplicitamente le raccolte in-memoria, allora tornerei ai tuoi dizionari.Ricorda, questo non ti impedisce di utilizzare le query LINQ sui dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top