我正在考虑重构一个存储库,我必须提高它的灵活性并减少方法数量。
有以下方法:
Collection GetAllUsersByRole(Role role)
User GetUserByuserName(string userName)
...我想采用Linq表达式的单一方法:
ICollection GetUsers(Expression e)
{
//retrieve user collection from store
//apply expression to collection and return
}
这是一种合理的方法吗?据推测,我会失去一些效率,因为每次都需要检索和过滤完整的用户集合,而不是根据一些硬编码的标准检索用户的子集?
编辑:NHibernate在我的实现中提供了ORM。
答案 0 :(得分:3)
你真的想把一个Expression作为该方法的参数。
就性能而言,它实际上取决于你想要用它走多远。最简单的方法是将所有对象放入内存,然后使用谓词表达式进行过滤。
另一方面,你提到某种标准。我不知道您的后端数据系统是什么,但您可以将这些通过的过滤器转换为您的标准。这基本上是Linq to SQL和Linq to Entities所做的,但希望您需要支持的各种可能性要小得多。如果不是,如果你想采用这种方法,切换到其中一个ORM工具可能是有意义的。
答案 1 :(得分:1)
这不是一种非常合理的方法,通常会导致很多性能问题。如果您使用接受LINQ查询的数据访问技术,那么您可以使用此查询(表达式)。对于LINQ to SQL,这可以是 IQueryable ,对于EntityFramework,可以是 ObjectQuery 。对于nHibernate,它也可以是 ICriteria (没有linq支持)。所有现代ORM工具都有自己的表达式API,因此您只需要使用它。如果您有自定义数据访问层,则需要编写自己的API来创建标准,例如Query Object。