我应该在哪里使用ToList()执行查询 - 在DAL,BLL或控制器中?

时间:2014-07-02 15:07:36

标签: asp.net-mvc n-tier-architecture

我有项目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 个答案:

答案 0 :(得分:1)

在我个人看来,这是一个数据问题所以决定调用.ToList()应该在DAL中发生。可能有一种情况可以灵活地将事物链接在一起或改进查询,因此您可以证明将调用放在BLL中,但是无论如何都要将这种灵活性构建到DAL中并且整体上DAL返回数据,而不是查询对象。

并非它在现实生活中发生过,但这也使您可以更灵活地将DAL与其他数据源(例如web api)交换掉。如果你将IQueryable流入你的DAL,那就更难了,层/层封装就会被破坏。

我不建议将IQueryable放入Controller中。

答案 1 :(得分:1)

我同意@cadmium,我也会在DAL中而不是在Controller中。

PS:我更喜欢尽可能传递IEnumerable,只处理具体的List&lt;&gt;什么时候你真的需要它。