加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 错误获取记录“LINQ to Entities无法识别方法”

发布时间:2020-12-16 06:31:32 所属栏目:asp.Net 来源:网络整理
导读:在以下代码中,我试图获取当前登录用户的配置文件. Dim userProfile = db1.UserProfiles.Where(Function(p) p.UserId = Membership.GetUser.ProviderUserKey).Single 错误是“LINQ to Entities无法识别方法’System.Object CompareObjectEqual(System.Object,
在以下代码中,我试图获取当前登录用户的配置文件.

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

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 Take和Where组件合并到一个SQL表达式中.您可以通过调用ToArray ToList或ToDictionary强制L2E命中服务器.该表达式可以通过将其更改为:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读