【问题标题】:Error Getting Record "LINQ to Entities does not recognize the method"错误获取记录“LINQ to Entities 无法识别该方法”
【发布时间】:2012-08-02 04:14:17
【问题描述】:

在下面的代码中,我试图获取当前登录用户的个人资料。

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

【问题讨论】:

  • UserId 属性的类型是什么?
  • UserId 是数据库中的字符串。

标签: asp.net-mvc vb.net asp.net-mvc-3 entity-framework


【解决方案1】:

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 无法比较两个对象,因此您需要在运行表达式之前对其进行强类型化。例如,如果您的用户密钥是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 由实体框架提供。

另外顺便说一句,L2E 会将链式调用分组到最后,所以表达式如下:

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

... 仍然会失败,因为 L2E 会将 Skip TakeWhere 组件组合到一个 SQL 表达式中。您可以通过调用ToArrayToListToDictionary 来强制L2E 访问服务器。该表达式可以通过将其更改为:

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

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

【讨论】:

  • 感谢您解决了该错误,但我得到了一个新错误,上面写着“对象引用未设置为对象的实例。”对此有任何想法还是我应该提出一个新问题?
  • 你能单步调试调试器,看看 Membership.GetUser 是否返回 null 吗? null.ProviderUserKey 肯定会出问题。此外,.Single() 被编程为在结果集为空时抛出异常——换句话说,如果它未能找到配置文件。
  • 抱歉浪费您的时间。我意识到我已注销,这将使当前用户为空。但是,登录并运行代码时,仍然出现此错误,“LINQ to Entities 无法识别方法 'System.Object CompareObjectEqual(System.Object, System.Object, Boolean)' 方法,并且无法翻译此方法到商店表达式中。”
  • 那是因为 MembershipUser.ProviderUserKey 是一个对象。我会更新我的答案以反映这一点。
  • 我尝试了最新的代码,但没有成功,所以我终于尝试将 guid 转换为字符串以与数据库中的其他字符串进行比较,但它给了我一个错误“The ' “UserProfile”上的 IsCompanyOwner 属性无法设置为“字符串”值。您必须将此属性设置为“布尔”类型的非空值。”我用我当前的代码更新了我的问题。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 2021-11-06
相关资源
最近更新 更多