2012-08-06 82 views
2

簡而言之:我可以在實體模型中以某種方式使用文字SQL子查詢而不使用數據庫視圖嗎?使用* sql *子查詢的實體框架查詢

上下文:我有一堆ADO.NET查詢導致C#對象。這些對象直接對應於查詢形狀;即我可以做ObjectContext.TranslateSqlDataReader中提取它們。有很多這些查詢,其中很多很複雜,其中一些使用實體框架不支持的功能(while循環,CTE,hierarchyids等) - 將這些(傳統)查詢轉換爲LINQ並不可行。但是,我真的很想能夠包裝這些結果,並在C#端添加一些自定義過濾:如排序,過濾,分頁等。我可以將每個查詢轉換爲視圖(或存儲過程),並映射這些,但這是一個麻煩和維護的噩夢 - 但原則上EF可以用於該路由的「不透明」的SQL查詢。

我可以以某種方式使用SQL中用實體模型編寫的子查詢嗎?返回IQueryable而不是IEnumerableObjectContext.Translate將是理想的,但不是必需的:絕大多數查詢都是編譯時常量,因此某種形式的預處理是可能的。

編輯:我在尋找的東西返回一個IQueryable這樣我就可以添加過濾器/排序客戶端但他們對DB執行(像往常一樣)。我首先使用實體​​框架代碼。

回答

3

您可以將EntitySet的DefiningQuery屬性設置爲某個文字SQL。這些或多或少與SQL視圖等價。這能解決你的問題嗎?

http://msdn.microsoft.com/en-us/library/cc982038.aspx

+0

那看起來不錯!但是,我注意到我忽略了提到我已經使用了代碼優先,並且不能將代碼與模型優先混合在同一個程序集中;所以這個解決方案看起來很難使用,很不幸。 – 2012-08-07 08:28:25

+0

標記爲答案:這可能是最好的解決方案,儘管它遠非理想。謝謝你的提示! – 2012-08-08 09:08:08

1

如果你的SQL查詢得到的結果與相同結構的實體類的,你可以使用DbContext.SqlQuery

var customer=context.Database. 
     SqlQuery<Customer>("SELECT ID,NAME from CUSTOMER WHERE TYPE IN 
        (SELECT TYPEID FROM IMPORTANT_TYPE)"); 

假設context是你的DbContext類對象

+1

不,這不起作用:'SqlQuery'返回'IEnumerable';所以如果我試圖用進一步的過濾來編寫結果,我會在客戶端做這件事(並且通常會檢索多餘的數據,因此速度很慢)。 – 2012-08-07 08:19:46