是时候开始将IQueryable <t>而不是IList <t>返回到我的Web UI / Web API层?</t> </t>

时间:2010-03-30 05:02:02

标签: asp.net-mvc repository-pattern iqueryable multi-tier

我有一个多层应用程序,它以所有数据访问的存储库模式开始,并将IQueryable返回到Services层。 Services层(包括所有业务逻辑)将IList返回给控制器(注意:我使用ASP.NET MVC作为UI层)。在数据访问层中返回IQueryable的好处是它允许我的存储库非常简单并且数据库查询将被延迟。但是,我在服务层触发数据库查询,以便我的单元测试更可靠,并且我没有给控制器灵活地重塑我的查询。但是,我最近遇到过几种情况,其中将查询的执行推迟到控制器会更加高效,因为控制器必须对UI特定的数据进行一些预测。另外,随着像oData这样的东西的出现,我开始怀疑端点(例如web UI或web apis)是否应该直接与IQueryable一起工作。你的想法是什么?是时候开始将IQueryable从服务层返回到UI层了吗?还是坚持使用IList?

这个帖子在这里:To return IQueryable<T> or not return IQueryable<T> 似乎保证将IList返回到UI层,但我想知道是否因为新兴技术和技术而发生了变化。

1 个答案:

答案 0 :(得分:3)

我喜欢尽可能坚持使用IQueryable接口,唯一的问题是当你最终在Controller级别进行复杂的过滤或按需重新查询时,如果你有类似的东西:

//DATA ACCESS
    public IQueryable<T> GetStudents()
    {
    return db.Students;
    }

在你的控制器中你做了一些重新锐化,因为你的客户想要过滤那些结果的一些数据,你肯定会想要在控制器级别做这件事:

var result = obj.GetStudents().Where(d=>d...);

对我来说还可以,但只是成像,如果任何其他模块需要使用相同的过滤器,你不能称之为因为它在控制器级别。 所以对我而言,它在DRY,灵活性和系统可扩展性之间取得了平衡。 如果你需要一个完全可扩展的系统,你需要对GetStudents()方法做一些或几次重载,并在控制器级别去掉任何重新锐化。