2
我試圖建立一個通用的方法,EF4.1在數據庫和本地內存中查找表中與特定條件相匹配的特定行。如何使一個匿名方法在LINQ to Entities中運行?
到目前爲止,這就是我所擁有的。
這是來電者。
dbEntities.MyTables.LocalAndDb(delegate(MyTable s)
{ return s.Description.Contains("test"); });
這是LocalAndDb
public static object LocalAndDb<T>(this DbSet<T> myTable, Func<T, bool> function) where T : class
{
// look in local
var item = myTable.Local.Where(o => function((T)o)).FirstOrDefault()
// if not exist, look in the database
if (item == null)
{
Expression<Func<T, bool>> predicate = (u) => function(u);
item = myTable.Where(predicate).FirstOrDefault();
}
return item;
}
問題是這條線。
item = myTable.Where(predicate).FirstOrDefault();
當它調用數據庫時,它會引發此錯誤。
「LINQ to Entities不支持LINQ表達式節點類型'Invoke'。」
我想這是因爲我傳入一個匿名方法,它不知道如何將其轉換爲SQL。我認爲將其轉換爲表達式對象會做到這一點,但它仍然不適合我。
我需要做什麼才能使匿名方法成爲LINQ可以變成SQL的東西?
編譯工作!謝謝謝謝謝謝!當談到EF時,我是一個全新的新手。但我現在要對性能方面進行一些研究。從你所說的話看來,當你「編譯」表達式時,無論是在方法中,還是在簽名或預編譯構造函數中,這都會影響性能? – Diskdrive
@stickman - 「預編譯」類的想法是,您可以輕鬆構建它一次(調用「編譯」一次),然後在多次調用「LocalAndDb」中重複使用結果,以使表達式爲' t在每次通話期間重新編譯。 –
這很整齊。再次感謝! – Diskdrive