在以下代码中,我试图获取当前登录用户的个人资料。
Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey).Single
错误是“LINQ to Entities 无法识别方法 '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
最佳答案
L2E 正在尝试将您的 Lamba 表达式 (p) p.UserId = Membership.GetUser.ProviderUserKey
呈现为可用于访问数据库的 SQL 表达式。
但是,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 无法比较两个对象,因此您需要在运行表达式之前对其进行强类型。例如,如果您的用户 key 是 String
:Dim user = Membership.GetUser()
Dim key as String= user.ProviderUserKey
Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = key).Single
这应该会更好,因为 L2E 可以理解简单的相等表达式
=
并且可以将其呈现为等效的 SQL 表达式,例如:SELECT * FROM Profiles WHERE UserId = @Argument
,其中 @Argument 由 Entity Framework 提供。另外顺便说一句,L2E 会将链式调用分组到最后,因此表达式如下:
db1.UserProfiles.Skip(10).Take(30).Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey)
... 仍然会失败,因为 L2E 会将
Skip
Take
和 Where
组件组合成单个 SQL 表达式。您可以通过调用 ToArray
ToList
或 ToDictionary
来强制 L2E 访问服务器。该表达式可以通过将其更改为:db1.UserProfiles.Skip(10).Take(30).ToArray().Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey)
ToArray
强制执行 SQL 语句,为您提供一个支持复杂 labas 的 .NET 数组。