Ho visto molti progetti con repository che restituiscono istanze di IQueryable
. Ciò consente ulteriori filtri e l'ordinamento può essere eseguito su un IQueryable
altro codice, che si traduce in diversi SQL generati. Sono curioso di sapere da dove provenga questo schema e se sia una buona idea.
La mia più grande preoccupazione è che IQueryable
è una promessa di colpire il database qualche tempo dopo, quando viene elencato. Ciò significa che un errore verrebbe generato all'esterno del repository. Ciò potrebbe significare che un'eccezione Entity Framework viene generata in un diverso livello dell'applicazione.
In passato ho anche riscontrato problemi con i set di risultati attivi multipli (MARS) (soprattutto quando si utilizzano le transazioni) e questo approccio sembra che ciò comporterebbe che ciò accada più spesso.
Ho sempre chiamato AsEnumerable
o ToArray
alla fine di ciascuna delle mie espressioni LINQ per assicurarmi che il database venisse colpito prima di lasciare il codice del repository.
Mi chiedo se la restituzione IQueryable
potrebbe essere utile come blocco predefinito per un livello dati. Ho visto del codice piuttosto stravagante con un repository che chiama un altro repository per crearne uno ancora più grande IQueryable
.
where
clausola a un differito IQueryable
, devi solo inviare quei dati via cavo, non l'intero set di risultati.