Asp.net mvc 获取记录时出错“;LINQ to实体不识别该方法;

Asp.net mvc 获取记录时出错“;LINQ to实体不识别该方法;,asp.net-mvc,vb.net,asp.net-mvc-3,entity-framework,Asp.net Mvc,Vb.net,Asp.net Mvc 3,Entity Framework,在下面的代码中,我尝试获取当前登录的用户的配置文件 Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey).Single 错误为“LINQ to Entities无法识别方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,此方法无法转换为存储表达式。”

在下面的代码中,我尝试获取当前登录的用户的配置文件

Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey).Single
错误为“LINQ to Entities无法识别方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,此方法无法转换为存储表达式。”

有人知道这有什么问题吗,或者有没有更好的方法。。。而且,我怎样才能使这更安全;i、 e.如果未找到记录,是否添加条件

我用的是VB ASP.NETMVC3

多谢各位

编辑:

这是我的新代码:

        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
对象
。SQL无法比较两个对象,因此您需要在运行表达式之前将其强类型化。例如,如果您的用户密钥是
字符串

Dim user = Membership.GetUser()
Dim key as String= user.ProviderUserKey
Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = key).Single
这应该可以更好地工作,因为L2E可以理解简单的等式表达式
=
,并且可以将其呈现为等价的SQL表达式,例如:

从配置文件中选择*,其中UserId=@Argument
,其中@Argument由实体框架提供

另外,L2E将分组链式调用,直到结束,因此表达式如下:

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

。。。仍然会失败,因为L2E将把
Skip
Take
Where
组件组合到一个SQL表达式中。您可以通过调用
ToArray
ToList
ToDictionary
来强制L2E点击服务器。可将该表达式更改为以下值,使其有效:

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


ToArray
强制执行SQL语句,为您提供了一个支持复杂lambas的.NET数组。

感谢您解决了这个错误,但我得到了一个新的错误,它说:“对象引用未设置为对象的实例。”关于这个问题有什么想法吗?或者我应该打开一个新问题吗?您可以单步调试并查看Membership.GetUser是否返回null吗?null.ProviderUserKey肯定会导致问题。另外,
.Single()
被编程为在结果集为空时抛出异常,换句话说,如果它找不到配置文件。很抱歉浪费您的时间。我意识到我已注销,这将使当前用户为空。但是,当登录并运行代码时,我仍然会遇到这样的错误,“LINQ to Entities无法识别方法'System.Object CompareObject Equal(System.Object,System.Object,Boolean)'方法,并且该方法无法转换为存储表达式。”这是因为MembershipUser.ProviderUserKey是一个对象。我将更新我的答案以反映这一点。我尝试了最新的代码,但它不起作用,因此我最终尝试将guid转换为一个字符串,以便与数据库中的其他字符串进行比较,但它给了我一个错误“无法将'UserProfile'上的'IsCompanyOwner'属性设置为'String'值。您必须将此属性设置为“Boolean”类型的非空值。“我用当前代码更新了我的问题。
UserId
属性的类型是什么?UserId是数据库中的字符串。