2015-02-05 67 views
0

我有一個基於Entity Framework構建的Service Repository模式。從LINQ Queryable傳遞表達式

該服務具有返回IEnumerable的方法,例如Find(IQuery查詢)。

IQuery對象是我們自己的查詢對象類型,我們將字符串轉換爲暴露IQueryable的存儲庫可以使用的IQueryable表達式。

我想要做的是能夠在客戶端編寫一個查詢,並通過服務傳遞,以便我們可以利用靜態類型和linq樣式查詢,而不是構建我們自己的查詢對象形成。

換句話說,我希望能夠做一些事情,如:

var query = new List<Type>().Where(x => x.Property == "argument").AsQueryable(); 
service.find(query); 

然後我會把它創建可查詢或表達式傳遞給我的信息庫和類似的工作。

這種事情是可能的,還是我必須從頭開始構建表達式?這似乎應該是可能的,但我真的不知道從哪裏開始或看到如何共享這樣的表達式的例子。

+0

哪一部分表達的由客戶通過?屬性密鑰?價值? – haim770 2015-02-05 15:43:34

+0

聽起來像你應該直接使用EF,因爲構建在它上面的平臺實際上並沒有爲你增加價值,而是去掉了價值。 – Servy 2015-02-05 15:44:44

+0

@servy這種方式肯定會更容易些,但其價值來源於不依賴於應用程序其餘部分中的EF以及與其分離。服務和存儲庫提供了一個關注點。 – twifosp 2015-02-05 15:47:42

回答

0

如果你調用AsQueryable()IEnumerable不已經實現了IQueryable,那麼整個枚舉只是塞進ConstantExpression,和以往任何LINQ操作不表示爲表達式樹。

如果你調用AsQueryable()權的來源,那麼LINQ操作用正確的查詢表達式樹返回IQueryable

var query = new List<Type>().AsQueryable().Where(x => x.Property == "argument");