2013-02-06 40 views
0

我想從實體框架中獲取帶有參數調試目的的查詢字符串。不,我不會使用EFProfiler,因爲查詢字符串需要作爲頁面上的輸出顯示。大多數這些查詢是使用ExecuteStoredQuery()手動編寫的。但是,將它們轉換爲ObjectQuery將產生空值。EF5 ObjectResult to ObjectQuery爲空?

實施例:

ObjectResult<Parent> model = _context.ObjectContext().ExecuteStoreQuery<Parent>("SELECT * FROM Parents"); 
var objectQuery = model.AsQueryable() as ObjectQuery<Parent>; 

的ObjectQuery爲空。 ObjectContext的()是看起來像一個DataContext的簡單的方法:

return (this as IObjectContextAdapter).ObjectContext; 

我已經用盡了自己的想法和任何由搜索產生回...嗯,沒用的,因爲似乎沒有人吃出問題。請注意,結果會從查詢中正確回來。

編輯:對,我也應該提到這一點。

這樣做:

var oq = m as ObjectQuery<Parent>; 

息率我:

無法通過引用轉換轉換型 'System.Data.Objects.ObjectResult' 到 'System.Data.Objects.ObjectQuery',拳擊轉換,拆箱轉換,包裝轉換或空類型轉換

從什麼時候我認爲它需要投出AsQueryable(),哪個,以及...爲空,原因很明顯。這是我累了的腦袋,忘了添加這個小細節。

回答

0

你投as ObjectQuery<Parent>不正確,導致ObjectResult<Parent>.AsQueryable()將返回IQueryable<Parent>ObjectQuery<Parent>類型的不行。

AsQueryable是將類IEnumerable轉換爲IQueryable的類Queryable的擴展方法。

結果是您的變量objectQuery爲空。

+0

我已經用這個被遺忘的細節更新了原始問題,它不允許我將原始m作爲對象查詢。 – NeroS

0

當然你真的想要使用CreateQuery(sql)而不是ExecuteStoreQuery(sql)。

給定名稱,ExecuteStoreQuery實際上運行SQL,而CreateQuery返回一個ObjectQuery準備發送到數據庫。

很明顯,你可以調用執行上的ObjectQuery返回ObjectResult

+0

我試過CreateQuery,遇到問題了。首先,它不喜歡用戶試圖選擇*時,您似乎想要指定需要獲取的所有字段(從應用程序的角度來看,這是不可接受的)。另外,我見過的所有允許使用ToTraceString()的例子都使用了ExecuteStoreQuery(),然後將其轉換爲ObjectQuery:/我不太確定後端會發生什麼。 – NeroS

1

我想其他anwers明確指出,你不能施放一個ObjectResult<T>ObjectQuery<T>。但我對你的評論感興趣

我試過CreateQuery,遇到了問題。首先,它不喜歡用戶試圖選擇*時,你似乎必須指定所有需要獲取的字段。

您可以使用ObjectQuery做一個「*」的搜索結果:

ObjectContext().ObjectQuery<Parent>("SELECT VALUE par FROM Parents AS par") 

正如你看到的,有查詢字符串沒有實際*和跟蹤字符串沒有一個*但顯示所有字段。但是,您不必指定所有字段來構建查詢字符串。我希望這能幫助你更好地使用ObjectQuery

+0

我認爲你的意思是'不能'而不是'可以投射'嗎? – Jehof