比如说我有(伪代码):
public IEnumerable<User> GetUsers(string name)
在我的实体框架的数据访问层中,目前它.ToList()
在返回之前执行,从而确保我的业务逻辑层不会干扰我的数据访问层。
但是,我需要在我的业务逻辑层对此稍有不同的变化,例如我需要更少的数据(例如,只需要用户 ID 或进一步过滤它)。
为了拥有一个高效的数据库层,我想要另一种方法返回数据的子集(重载方法或其他方法)。
但是,我可以“作弊”并省略 ToList(),而我的业务逻辑层最后添加了 AsQueryable()。因此,我的业务逻辑层能够操作创建的底层 sql。
人们对业务逻辑层中的 AsQueryable() 有何看法?在我看来,这是对我的数据访问层的泄漏抽象,但它可能非常方便,也许是因为它位于 LINQ 命名空间(而不是 EF 命名空间)中,所以使用它并不是那么糟糕?
编辑
需要注意的一些有用的东西(以及反对省略 ToList() 的论点)是,如果调用它的代码以前依赖 ToList() 进行数据绑定,即避免错误“数据直接绑定到存储查询(DbSet、DbQuery、不支持 DbSqlQuery)。” 你不会得到一个编译时错误,只是一个运行时错误。因此,您需要确保在 UI 层之前确实调用了 ToList()。