2

比如说我有(伪代码):

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

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

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

但是,我可以“作弊”并省略 ToList(),而我的业务逻辑层最后添加了 AsQueryable()。因此,我的业务逻辑层能够操作创建的底层 sql。

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


编辑

需要注意的一些有用的东西(以及反对省略 ToList() 的论点)是,如果调用它的代码以前依赖 ToList() 进行数据绑定,即避免错误“数据直接绑定到存储查询(DbSet、DbQuery、不支持 DbSqlQuery)。” 你不会得到一个编译时错误,只是一个运行时错误。因此,您需要确保在 UI 层之前确实调用了 ToList()。

4

1 回答 1

1

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

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

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

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

于 2013-02-27T10:33:20.013 回答