Sto usando ASP.NET MVC 3
. I ottenere i dati del mio modo di vedere nel seguente ordine:Il filtraggio dei dati avviene nei livelli controller, servizio o repository?
Controller -> Service Layer -> Repository
Nel mio repository Ho un metodo GetAll che riporta tutti i record per un oggetto specifico, come categoria.
Quindi, se ho bisogno di un elenco di tutte le categorie poi nel mio controller vorrei avere qualcosa di simile:
IEnumerable<Category> categories = categoryService.GetAll();
Nel livello di servizio vorrei avere qualcosa di simile:
public IEnumerable<Category> GetAll()
{
return categoryRepository.GetAll();
}
Ora questo è quello che devo sapere da dove effettivamente inizio a filtrare i dati? Può essere fatto ovunque in uno di questi 3 livelli o deve essere solo nel livello repository? Diciamo che ho bisogno di tutte le categorie genitore. Ho il .GetAll.Where(x => x.ParentCategoryId == null);
nel mio controller, livello di servizio o livello di repository?
ce l'ho come questo nel mio controller:
IEnumerable<Category> categories = categoryService.GetParentCategories();
E nel mio livello di servizio che può avere:
public IEnumerable<Category> GetParentCategories()
{
return categoryRepository.GetAll.Where(x => x.ParentCategoryId == null);
}
O fa il mio livello di servizio deve guardare in questo modo:
public IEnumerable<Category> GetParentCategories()
{
return categoryRepository.GetParentCategories();
}
E quindi nel mio livello di repository in questo modo:
public IEnumerable<Category> GetParentCategories()
{
return GetAll()
.Where(x => x.ParentCategoryId == null);
}
Per favore qualcuno può aiutare a chiarire questa confusione che ho. Potrebbero esserci diversi scenari. Potrei riportare tutte le categorie che hanno uno stato attivo. Potrei riportare le categorie con uno stato inattivo. Allora ho bisogno di un metodo per ciascuno?
Il GetAll è solo un metodo di esempio, l'obiettivo principale è sulla parte filtrante. Creo quindi un metodo nel repository per ogni utilizzo? Ma non il .Where (...) funziona come una selezione sql con una clausola where? –
Solo quando si utilizza LINQ per le entità e per questo è necessario un "IQueryable". –
Sì. Ho un metodo Get tat is IQueryable in ther epository, in modo che il repository possa gestire tutte le condizioni che uno getta su di esso. Un metodo GetALlUsers() mi fa licenziare le persone. È inefficiente come l'inferno. Tirando 100.9000 utenti per ottenere quello per nome - no. –
TomTom