重载。使用IQueryable <t>实现的扩展名</t>

时间:2011-08-26 23:24:42

标签: c# linq entity-framework orm linq-to-entities

我的问题是,当您进行自己的IQueryable实现时,如何/何时重载(如果可能的话)?IQueryable的Where()扩展方法?

例如,在Entity Framework中,我理解对ObjectSet进行的Where()调用将改变传递给数据库的实际SQL。或者,如果您首先转换为IEnumerable(),则使用LINQ-To-Objects而不是LINQ-To-Entities完成过滤。

例如:

new MyDBEntities().MyDbTable.Where(x => x.SomeProperty == "SomeValue"); 
  // this is linq-to-entities and changes the database-level SQL

对战:

new MyDBEntities().MyDbTable.AsEnumerable().Where(x => x.SomeProperty == "SomeValue"); 
  // this is linq-to-objects and filters the IEnumerable 

如何在实现自己的IQueryable时处理这个问题,而IQueryable已经有预定义的扩展方法,比如Where()?具体来说,我想制作我自己的非常简单的ORM,它使用本机SQL和SqlDataReader,并希望有一个.Where()方法在将本机SQL传递给数据库之前更改它。

我是否应该使用IQueryable或完全创建自己的类?我希望能够使用lambda语法并根据用于过滤的lambda函数更改我的SQL命令。

1 个答案:

答案 0 :(得分:1)

可以创建类似于IQueryable<T>的自己的类型,但这可能不是一个好主意。您应该编写自己的接口实现。 There is a nice series of articles on how to do it,但要做好准备,这样做不是一件容易的事。