【问题标题】:Where should I execute query using ToList() - in DAL, BLL or in controller?我应该在哪里使用 ToList() 执行查询 - 在 DAL、BLL 或控制器中?
【发布时间】:2014-07-02 15:07:36
【问题描述】:

我有 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);
}

【问题讨论】:

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


    【解决方案1】:

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

    这在现实生活中从未发生过,但这也为您提供了更大的灵活性,可以将 DAL 替换为其他一些数据源(例如 Web api)。如果您将 IQueryable 引入 DAL,则会变得更加困难,并且层/层封装会被破坏。

    我不建议让 IQueryable 进入控制器。

    【讨论】:

    • thx - 所以 ToList() 在 DAL 中并返回 IEnumerable 而不是 IQueryable - thx :)
    【解决方案2】:

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

    PS:我更喜欢总是尽可能地传递 IEnumerable,并且只在您真正需要时处理具体的 List。

    【讨论】:

    • 当它实际上是一个列表时,为什么要返回 IEnumerables?有人可以做另一个 .ToList()。我总是尝试要求最不具体的输入,并尽可能具体地返回输出。
    • @Maarten,在这个例子中(使用数据库访问)我会通过 IEnumerable 因为你可以将工作推迟到实际枚举。另一个原因是 IEnumerable 是一个通用接口,而 List 是实际的实现。假设由于某种原因,您需要将返回从 List 更改为 Array,如果返回类型是 List,您需要将签名更改为 Array,并且已经使用该代码的用户也需要。如果签名是 Enumerable,则可以更改为数组,消费者无需更改。但是,一如既往,这取决于您的需求。
    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多