ASP MVC:服务应该返回IQueryable吗?

时间:2010-02-06 22:52:56

标签: c# asp.net-mvc iqueryable dao

你怎么看?如果您的DAO返回IQueryable以在控制器中使用它吗?

4 个答案:

答案 0 :(得分:5)

没有。您的控制器根本不应该处理任何复杂的逻辑。保持苗条;模型(不是DAO)应该将控制器的所有内容传递给视图。

在Controller类中查看查询(甚至查询)是我认为是代码味道的东西。

答案 1 :(得分:4)

目前,这听起来很有吸引力,但really isn't

答案 2 :(得分:4)

我喜欢将IQueryable传递给我的控制器,因为在我的应用开发的整个生命周期中,我不必在每个DAO方法和接口中创建蹩脚的分页和排序方法。

GetCustomersByLastname( string lastname )

快速成为

GetCustomersByLastname( string lastname, string sortcolumn, int pagesize, int page )

一次又一次。布莱克!

使用IQueryable,您可以采用正交方式实现分页和排序,例如利用IPagedList项目。返回IQueryable还可以轻松访问总对象.Count(),而无需更多地反转数据层。

@Robert的IQueryable等于胖控制器的论点是非常不稳定的。 Fat控制器类似于昔日的膨胀.aspx.cs页面。如果您所做的一切都是连接到您的DAL,然后将结果发送出去,不要从查询技术中获得“肥胖”,那么您可以通过在单个类中推送大量逻辑来获得它。除非您开始在内部滚动日志记录,通知和其他正交问题,否则您不会因为数据访问方法而获得Fat Controller。

public ActionResult Detail( string searchTerm )
{
    var model = MyDAL.MyObjects( searchTerm );
}

vs:

public ActionResult Detail( string searchTerm )
{
    var model = MyDAL.MyObjects.Where( x => x.Name == searchTerm );
}

我没有看到令人信服的差异。

@Mark Seemann的答案同样不稳定。当然,您可以在项目中间更改整个数据层,但无论您有多抽象,这都将是一场复杂的灾难。他使用的示例是从Linq2Sql切换到Windows Azure的表存储。 RDBMS到Key / Value商店?痛点是你的Repository实现?从RDBMS到Key / Value商店将是一些疯狂,无论如何都会变得非常糟糕。

马克还在他的论点中提出了领域驱动设计。这是你的建筑系统类型。是否有足够的“域”而非纯粹的CRUD场景使这种方法有价值?如果不是那么为什么要打扰?

使用和LINQ以及IQueryable接口可以减少切换数据层的痛苦。如果您在支持LINQ和IQueryableProvider的ORM之间切换(我认为这就是名称),而不仅仅是下游代码关心该更改。您的控制器将保持与现在市场上大多数ORM之间的切换。

答案 3 :(得分:2)

如果您遵循“胖模型,瘦模控制器”范例,那么没有。

Fat Controller anti-pattern上查看此帖子。