2013-02-27 56 views
2

例如说我有(伪代码):业务逻辑层中的AsQueryable() - 不好的做法? (我是这么认为的,但....)

在我的数据访问层到实体框架,这在目前返回,从而保证了我的生意才做了.ToList()public IEnumerable<User> GetUsers(string name)逻辑层不能干扰我的数据访问层。

但是,在我的业务逻辑层中,我需要稍微不同的变体,例如我需要更少的数据(例如只是userid或进一步过滤它)。

要有一个高效的数据库层,我希望另一个方法返回数据的一个子集(重载方法或其他)。但是,我可以“欺骗”并省略ToList(),并且我的业务逻辑层在最后加上了一个AsQueryable()。因此,我的业务逻辑层能够操纵创建的底层sql。

什么是人们对业务逻辑层中AsQueryable()的想法?在我看来,这是对我的数据访问层的抽象抽象,但它可能非常方便,也许是因为它位于LINQ命名空间(而不是EF命名空间)中,它并不是很糟糕的用法?


编辑

东西(对省略ToList()和参数)有用的注意的是,如果代码调用它以前依靠ToList()数据绑定,即避免错误“数据直接绑定到商店查询(DbSet,DbQuery,DbSqlQuery)不受支持。”你不会得到编译时错误,只是运行时错误。所以你需要确保ToList()在UI层之前肯定被调用。

+1

我通常采用的规则,实体框架*是*我的数据层 - 我没有一个单独的DAL的顶部。我注意到[StackOverflow同意](http://blog.stackoverflow.com/2008/09/what-was-stack-overflow-built-with/)(尽管使用Linq-to-SQL)! – 2013-02-27 10:27:15

+2

您是否在使用存储库模式? – Jehof 2013-02-27 10:27:47

+0

好问题,是的,我们正在使用存储库模式来执行我们的多租户过滤。 – 2013-02-27 10:30:36

回答

1

我个人只是添加第二个方法,在我的数据访问层做一个ToList()并调用它。这是更加整洁的方式:

functionA() 
{ 
    return myDB.entityA.AsQueryable(); 
} 

functionB() 
{ 
    return functionA().ToList(); 
} 

你可能需要从某个地方的某个地方在将来调用相同的功能。保持在一个地方。