我的问题是,当您进行自己的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命令。
答案 0 :(得分:1)
你可以创建类似于IQueryable<T>
的自己的类型,但这可能不是一个好主意。您应该编写自己的接口实现。 There is a nice series of articles on how to do it,但要做好准备,这样做不是一件容易的事。