2012-08-01 62 views
3

在下面的代碼,我想這應該是當前登錄用戶的配置文件。錯誤獲取記錄「LINQ到實體無法識別方法」

Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey).Single 

的錯誤是「LINQ到實體無法識別方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,並且此方法不能轉換爲存儲表達式。「

有沒有人知道這有什麼問題,還是有更好的辦法......而且,我怎樣才能讓這個更安全;即如果沒有找到記錄就添加一個條件?

我使用VB ASP.NET MVC 3.

謝謝。

編輯:

這是我的新代碼:

 Dim db1 As UserProfileDbContext = New UserProfileDbContext 
     Dim user = Membership.GetUser() 
     Dim key As Guid = user.ProviderUserKey 
     Dim finalKey = key.ToString 
     Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = finalKey).Single 
     Dim companyId = userProfile.CompanyId 
+0

「UserId」屬性的類型是什麼? – nemesv 2012-08-01 19:53:56

+0

UserId是來自數據庫的字符串。 – user1477388 2012-08-01 19:56:18

回答

6

L2E試圖渲染到它可以用它來訪問數據庫SQL表達式您蘭巴表達(p) p.UserId = Membership.GetUser.ProviderUserKey

但是,Membership.GetUser()是一種.NET方法。 L2E抱怨說它不知道如何將這個方法渲染成SQL語法。

試試這個:

Dim user = Membership.GetUser() 
Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = user.ProviderUserKey).Single 

編輯:MembershipUser.ProviderUserKey是一個CLR Object。 SQL無法比較兩個對象,因此您需要在運行表達式之前強行鍵入它。例如,如果您的用戶密鑰是String

Dim user = Membership.GetUser() 
Dim key as String= user.ProviderUserKey 
Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = key).Single 

這應該更好地工作,因爲一個簡單的等價式=由L2E理解,並且可以在呈現給equivilent SQL表達式,是這樣的:

SELECT * FROM Profiles WHERE UserId = @Argument,其中@參數由實體框架提供。

而且順便說一句,L2E將組鏈式調用才結束,所以一個表達式,如:

db1.UserProfiles.Skip(10).Take(30).Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey)

...仍然會失敗,因爲L2E將結合在SkipTakeWhere組件到一個單一的SQL表達式。您可以通過調用ToArrayToListToDictionary來強制L2E擊中服務器。這種表達可以通過它改變爲有效的:

db1.UserProfiles.Skip(10).Take(30).ToArray().Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey)

ToArray強制SQL語句的執行,給你一個.NET數組,它確實支持複雜lambas。

+0

謝謝你照顧那個錯誤,但我得到一個新的說:「對象引用沒有設置爲一個對象的實例。」對此有任何想法或者我應該提出一個新問題? – user1477388 2012-08-01 19:52:55

+0

你可以通過調試器,看看Membership.GetUser是否返回null? null.ProviderUserKey肯定會導致問題。此外,如果結果集爲空,換句話說,如果找不到配置文件,則'.Single()'會被編程爲引發異常。 – Kivin 2012-08-01 19:59:09

+0

很抱歉浪費你的時間。我意識到我已註銷,這將使當前用戶爲空。但是,登錄並運行代碼時,仍然出現此錯誤,「LINQ to Entities無法識別方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,並且此方法無法翻譯進入商店的表達。「 – user1477388 2012-08-01 20:03:54

相關問題