Estoy usando ASP.NET MVC 3
. Puedo obtener los datos de mi vista en la siguiente secuencia:¿El filtrado de datos tiene lugar en las capas de controlador, servicio o repositorio?
Controller -> Service Layer -> Repository
En mi repositorio que tienen un método GetAll que recupera todos los registros de un objeto específico, como Categoría.
Así que si necesito una lista de todos las categorías a continuación, en mi controlador Me gustaría tener algo como:
IEnumerable<Category> categories = categoryService.GetAll();
En la capa de servicio que tendría algo como:
public IEnumerable<Category> GetAll()
{
return categoryRepository.GetAll();
}
Ahora esto es lo que necesito saber ¿dónde realmente empiezo a filtrar los datos? ¿Se puede hacer en cualquier lugar en una de estas 3 capas o solo tiene que estar en la capa de repositorio? Digamos que necesito todas las categorías principales. ¿Tengo el .GetAll.Where(x => x.ParentCategoryId == null);
en mi controlador, capa de servicio o capa de repositorio?
¿Debo tenerlo como este en mi controlador:
IEnumerable<Category> categories = categoryService.GetParentCategories();
Y en mi capa de servicio que puede tener:
public IEnumerable<Category> GetParentCategories()
{
return categoryRepository.GetAll.Where(x => x.ParentCategoryId == null);
}
O es que mi capa de servicio tiene que tener este aspecto:
public IEnumerable<Category> GetParentCategories()
{
return categoryRepository.GetParentCategories();
}
Y luego en mi capa de repositorio de esta manera:
public IEnumerable<Category> GetParentCategories()
{
return GetAll()
.Where(x => x.ParentCategoryId == null);
}
Por favor alguien puede ayudar a aclarar esta confusión que tengo. Puede haber diferentes escenarios. Podría traer de vuelta todas las categorías que tienen un estado activo. Podría traer de vuelta categorías con un estado inactivo. Entonces, ¿necesito un método para cada uno?
GetAll es solo un método de muestra, el foco principal está en la parte de filtrado. ¿Entonces creo un método en el repositorio para cada uso? Pero, ¿no funciona el .Where (...) como un sql select con una cláusula where? –
Solo cuando uses LINQ para entidades y necesitarás 'IQueryable' para eso. –
Sí. Tengo un método Get tat es IQueryable en el repositorio, por lo que el repositorio puede manejar todas las condiciones que se le presenten. Un método GetALlUsers() me hace despedir gente. Es ineficiente como el infierno. Atrayendo a 100.9000 usuarios para obtener uno por nombre - no. –
TomTom