存储库采用linq表达式进行过滤

时间:2010-02-03 14:13:33

标签: linq repository-pattern expression

我正在考虑重构一个存储库,我必须提高它的灵活性并减少方法数量。

有以下方法:

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。

2 个答案:

答案 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