2013-05-19 72 views
0

我想使用泛型將記錄加載到我的dbcontext緩存中。我正在使用下面的代碼。C#實體框架5.0通用LINQ

_Context.Set<T>().Where(R => (int)R.GetType().GetProperty("Id").GetValue(R) == id).Load(); 

此代碼拋出下面的錯誤,我似乎無法弄清楚如何繞過它。

System.NotSupportedException:LINQ to Entities不能識別方法'System.Object GetValue(System.Object)'方法,並且此方法無法轉換爲存儲表達式。

是我在做什麼可能或有另一種方式。

+0

如果您有基本實體類型並添加特徵'where T:BaseEntity',這可能會起作用。那麼你可以使用'R.ID'。 –

+0

Unforuntaley我需要使用其中T:類來訪問dbset一般 –

+0

我也發現,我可以使用下面的代碼,它似乎將記錄添加到本地緩存,不知道這是做正確的方式。 _Context.Set ().Find(id); –

回答

4

問題是,您正試圖使用​​反射方法(GetType(),GetProperty()GetValue())與LINQ to Entities,它不理解它們。您在LINQ查詢中允許使用的方法僅限於查詢提供程序支持的方法,在LINQ to Entities的情況下,它大部分可以相對容易地轉換爲SQL。

你將無法嘗試這種方式匹配ID,很遺憾。使用.Find(id)將工作,只要通過指定T實體類型的主鍵的一列和id是正確的類型,但是這將是一個非常脆弱的方法,即使它在某些情況下。

如果你描述你的情況多一點,人們可能有另一種方法把一些很好的建議。你能解釋一下爲什麼你想這麼做嗎?想要在不知道自己感興趣的實體類型的情況下執行對您的DbContext的查詢是非常不尋常的。

+0

的*只要主鍵由T指定的實體類型具有單列*不正確:http://msdn.microsoft.com/en-us/library/gg696418(v=vs.103).aspx但正確的是它是一種脆弱的方法。 –

+0

@ ta.speot.is我的意思是,如果你只傳遞Find()一個值(如他的例子),那麼主鍵也必須包含一列。如果您嘗試執行「查找(ID)」,並且實體類型具有複合主鍵,則它會變成barf。 –

+0

@Jeremy Todd,將其標記爲已回答,因爲它確實回答了我的問題,但我還沒有找到更好的方法來查找函數。我不太瞭解基本實體概念 –