业务逻辑层中的AsQueryable() - 糟糕的做法? (我想是的,但......)

时间:2013-02-27 10:24:08

标签: linq entity-framework n-tier-architecture asqueryable

比方说我有(伪代码):

public IEnumerable<User> GetUsers(string name)在我的实体框架的数据访问层中,目前在返回之前执行.ToList(),从而确保我的业务逻辑层不会干扰我的数据访问层。

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

要拥有一个高效的数据库层,我想要另一个方法返回数据的子集(重载方法或其他)。

然而,我可以“欺骗”并省略ToList(),我的业务逻辑层最终将AsQueryable()定位。因此,我的业务逻辑层能够操作创建的底层sql。

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


修改

有用的注意事项(以及省略ToList()的参数)是,如果调用它的代码以前依赖于ToList()进行数据绑定,即避免错误“数据绑定直接存储查询(DbSet) ,DbQuery,DbSqlQuery)不受支持。“您不会收到编译时错误,只会出现运行时错误。因此,您需要确保在UI层之前调用ToList()。

1 个答案:

答案 0 :(得分:1)

我个人只是添加第二种方法,在我的数据访问层中执行ToList()并调用它。它更整洁:

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

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

您可能需要在将来的某个时间从其他地方调用相同的功能。把它放在一个地方。