Где я должен выполнить запрос с помощью ToList() - в DAL, BLL или в контроллере?


У меня есть проект DAL, BLL и Web. Где я должен выполнить запрос с помощью ToList ()?

Прямо сейчас я выполняю запрос с помощью ToList () в контроллере-это нормально? Например-с самого начала:

DAL-мой метод в классе NotesRepository:

public IQueryable<Notes> GetAllNotes()
{
    return context.Notes.Include(x => x.Comments).OrderByDescending(x => x.CreateDate);
}

BLL-мой метод в классе NotesService:

public IEnumerable<Notes> GetNotes()
{
    return _unitOfWork.NotesRepository.GetAllNotes();
}

Web-мое действие в контроллере (выполнение запроса с помощью ToList ()):

public ActionResult Index()
{
    var notes = _notesService.GetNotes().ToList();

    return View(notes);
}
2 2

2 ответа:

По моему личному мнению, это касается данных, поэтому решение позвонить .ToList() должно произойти в DAL. Возможно, есть основания для гибкости, чтобы, возможно, связать вещи вместе или уточнить запрос, так что вы могли бы оправдать размещение вызова в BLL, но вы все равно строите эту гибкость в DAL и в целом возвращаете данные DAL, а не объекты запроса.

Не то, чтобы это когда-либо происходило в реальной жизни, но это также дает вам больше гибкости, чтобы поменять DAL с некоторыми другими источник данных (например, веб-api). Если вы пускаете кровь IQueryable в ваш DAL, это становится сложнее, и инкапсуляция слоя/уровня нарушается.

Я бы не рекомендовал впускать IQueryable в контроллер.

Я согласен с @cadmium, я бы также сделал это в DAL, а не в контроллере.

PS: Я предпочитаю передавать IEnumerable всегда, насколько это возможно, и обрабатывать конкретный список только тогда, когда вам это действительно нужно.