比方说我有(伪代码):
public IEnumerable<User> GetUsers(string name)
在我的实体框架的数据访问层中,目前在返回之前执行.ToList()
,从而确保我的业务逻辑层不会干扰我的数据访问层。
但是,在我的业务逻辑层中,我需要稍微不同的变体,例如我需要更少的数据(例如,只需要用户ID或进一步过滤它)。
要拥有一个高效的数据库层,我想要另一个方法返回数据的子集(重载方法或其他)。
然而,我可以“欺骗”并省略ToList(),我的业务逻辑层最终将AsQueryable()定位。因此,我的业务逻辑层能够操作创建的底层sql。
人们对业务逻辑层中AsQueryable()的看法是什么?在我看来,这是对我的数据访问层的漏洞抽象,但它可能非常方便,也许是因为它在LINQ命名空间(而不是EF命名空间)中,使用它并不是那么糟糕?
修改
有用的注意事项(以及省略ToList()的参数)是,如果调用它的代码以前依赖于ToList()进行数据绑定,即避免错误“数据绑定直接存储查询(DbSet) ,DbQuery,DbSqlQuery)不受支持。“您不会收到编译时错误,只会出现运行时错误。因此,您需要确保在UI层之前调用ToList()。
答案 0 :(得分:1)
我个人只是添加第二种方法,在我的数据访问层中执行ToList()并调用它。它更整洁:
functionA()
{
return myDB.entityA.AsQueryable();
}
functionB()
{
return functionA().ToList();
}
您可能需要在将来的某个时间从其他地方调用相同的功能。把它放在一个地方。