错误获取记录“LINQ到实体无法识别方法”
在下面的代码,我想这应该是当前登录用户的配置文件。错误获取记录“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
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将结合在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语句的执行,给你一个.NET数组,它确实支持复杂lambas。
谢谢你照顾那个错误,但我得到一个新的说:“对象引用没有设置为一个对象的实例。”对此有任何想法或者我应该提出一个新问题? – user1477388 2012-08-01 19:52:55
你可以通过调试器,看看Membership.GetUser是否返回null? null.ProviderUserKey肯定会导致问题。此外,如果结果集为空,换句话说,如果找不到配置文件,则'.Single()'会被编程为引发异常。 – Kivin 2012-08-01 19:59:09
很抱歉浪费你的时间。我意识到我已注销,这将使当前用户为空。但是,登录并运行代码时,仍然出现此错误,“LINQ to Entities无法识别方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,并且此方法无法翻译进入商店的表达。“ – user1477388 2012-08-01 20:03:54
“UserId”属性的类型是什么? – nemesv 2012-08-01 19:53:56
UserId是来自数据库的字符串。 – user1477388 2012-08-01 19:56:18