Ho visto molti progetti con repository che restituiscono istanze di IQueryable
. Ciò consente di eseguire ulteriori filtri e ordinamenti su IQueryable
da un altro codice, che si traduce in diversi SQL generati. Sono curioso di sapere da dove viene questo schema e se sia una buona idea.
La mia più grande preoccupazione è che un IQueryable
è una promessa di colpire il database qualche tempo dopo, quando viene enumerato. 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.
Ho anche avuto problemi con i Multiple Active Result Sets (MARS) in passato (specialmente quando si usano le transazioni) e questo approccio sembra che ciò potrebbe accadere più spesso.
Ho sempre chiamato AsEnumerable
o ToArray
alla fine di ciascuna delle mie espressioni LINQ per assicurarmi che il database venga colpito prima di lasciare il codice del repository.
Mi chiedo se restituire IQueryable
potrebbe essere utile come blocco di base per un livello dati. Ho visto un codice piuttosto stravagante con un repository che chiama un altro repository per creare un IQueryable
ancora maggiore.