2012-08-01 63 views
3

在下面的代码,我想这应该是当前登录用户的配置文件。错误获取记录“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 
+0

“UserId”属性的类型是什么? – nemesv 2012-08-01 19:53:56

+0

UserId是来自数据库的字符串。 – user1477388 2012-08-01 19:56:18

回答

6

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将结合在SkipTakeWhere组件到一个单一的SQL表达式。您可以通过调用ToArrayToListToDictionary来强制L2E击中服务器。这种表达可以通过它改变为有效的:

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

ToArray强制SQL语句的执行,给你一个.NET数组,它确实支持复杂lambas。

+0

谢谢你照顾那个错误,但我得到一个新的说:“对象引用没有设置为一个对象的实例。”对此有任何想法或者我应该提出一个新问题? – user1477388 2012-08-01 19:52:55

+0

你可以通过调试器,看看Membership.GetUser是否返回null? null.ProviderUserKey肯定会导致问题。此外,如果结果集为空,换句话说,如果找不到配置文件,则'.Single()'会被编程为引发异常。 – Kivin 2012-08-01 19:59:09

+0

很抱歉浪费你的时间。我意识到我已注销,这将使当前用户为空。但是,登录并运行代码时,仍然出现此错误,“LINQ to Entities无法识别方法'System.Object CompareObjectEqual(System.Object,System.Object,Boolean)'方法,并且此方法无法翻译进入商店的表达。“ – user1477388 2012-08-01 20:03:54

相关问题