2013-11-20 109 views
0

我在名爲'GetName'的Enum上有一個擴展方法,它返回一個字符串。我在linq中使用它來實體框架來選擇具有特定產品名稱的行。但是,當代碼執行時,它會拋出一個'NotSupportedException'在Enum上的擴展方法導致Linq查詢失敗

「LINQ to Entities does not recognized the method'System.String GetName(Tool.ViewModels.Product)'method,this method can not be converted into a商店表達「。

這裏是代碼我執行:

try 
{ 
    //Linq to Entity Framework 
    var contextRow = Contexts.Data.Source.SingleOrDefault(p => p.Product == Product.ProductOne.GetName()); 

} 
catch (Exception e) 
{ 


    throw e; 
} 

是否LINQ的不承認在其評估擴展方法?還是有更多的事情呢?

+0

這種問題在開始使用Entity Framework時非常有名:) –

+0

這很容易解決,我只是好奇它爲什麼會發生。 – Martin

+3

「這個方法不能被翻譯成商店表達式」,這意味着:沒有辦法將它翻譯成SQL。 –

回答

1

實體框架正在將您鍵入的代碼映射到SQL查詢中。當它看到GetName的呼叫時,它將看到一個呼入用戶定義的功能。它沒有能力將基本相當於原始IL的內容翻譯成格式良好的SQL查詢。這就是爲什麼你得到該異常

+0

這裏的問題是,我正在緩存我的數據。例如:http://stackoverflow.com/questions/6421127/entity-framework-4-and-caching-of-query-results 所以它不應該去sql,應該嗎? – Martin

+0

我剛剛意識到執行緩存的代碼是不正確的。這導致linq去sql,這是我的問題。謝謝! – Martin

0

使用LINQ時,你必須定義一個上下文和語境中對數據庫進行操作,例如要運行的代碼,你可以這樣

使用(ModelLinq _context = new ModelLinq()){

var rows = _context.anyTable.Where(p => p.anyColumn == value);

}

和Entity Framework是你的數據庫的映射您與lenguale C#執行SQL查詢

的問候!