2011-08-26 66 views
0

我的問題是如何/何時有意義重載(如果可能?)Where()擴展 IQueryable的方法,當你正在做自己的IQueryable實現?重載.Where擴展與IQueryable <T>實現

例如在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的已經已經預先定義的擴展方法時,如其中()?具體而言,我想讓我自己的非常簡單的ORM使用本機SQL和SqlDataReader,並且希望有一個.Where()方法在將它傳遞到數據庫之前更改本機SQL。

我應該甚至使用IQueryable還是完全創建自己的類?我希望能夠使用lambda語法,並根據用於過濾的lambda函數改變我的SQL命令。

+0

我不確定這是否有幫助,但您可能想至少閱讀一下relinq:http://relinq.codeplex.com/他們可能已經完成了一些您正在尋找的東西(它是開放的資源)。或者也許根本沒有重疊。 –

回答

1

可能創建類似於IQueryable<T>的類型,但這可能不是一個好主意。你應該編寫你自己的接口實現。 There is a nice series of articles on how to do it,但要做好準備,這樣做並不是一件容易的任務。

+0

如果您自己實現IQueryable 並且完成所有表達式訪問者的工作,您是否自動獲得自定義的.Where()擴展方法,或者是否必須針對您的新類型編寫自己的.Where()擴展方法派生自IQueryable,即公共靜態MyQueryableImpl Where(this MyQueryableImpl ,Func filter).. –

+0

如果你這樣做了,'Queryable.Where()'方法將會做你所需要的。這就是它的目的。所以,不,你不需要實現你自己的Where(),但是你需要編寫將包含調用的表達式的代碼寫入Where()來糾正SQL。 – svick