2011-07-13 37 views
4

有人可以请我解释为什么我的LINQ代码出现这个错误吗?Linq To Entities异常无法识别该方法,无法转换为商店表达式

LINQ实体无法识别方法“System.String GenerateHashWithSalt(System.String,System.String)”方法,该方法 不能被翻译成表达商店。

var query = (from u in context.Users 
         where 
         u.Password == 
          GenerateHashWithSalt(password, GetUserID(username)) 
         select u).Count(); 

回答

12

您试图传递到EF一个方法,尝试该方法转换为已知的SQL命令。 SQL不知道GenerateHashWithSalt(System.String, System.String)
您应该首先将结果分配给一个变量,然后生成您的Linq到实体查询。


var hashedPassword = GenerateHashWithSalt(password, GetUserID(username)); 
var user = (from p in Users 
     where p.Password == hashedPassword 
     select p).FirstOrDefault(); 
+0

感谢您的快速回复,我完全按照您的建议进行了操作,并且工作正常。非常好,干净的解释。 – Nivash

+0

如果在查询时间之前无法获得该值,会发生什么情况?我有同样的错误,但这是我的查询: '(从用户作为UserInfo在context.UserInfo其中Membership.GetUser(user.login).IsApproved = False或user.isValidated = False).ToList' – adripanico

0

LINQ提供看你表达式树,并尝试生成从相当于TSQL(ETC)。这只适用于确认方法,或确认表达方案。

它不能查看您的C#代码中的任意方法,并在数据库中执行该方法。

但是!你可以简化查询它:

var hash = GenerateHashWithSalt(password, GetUserID(username); 
var count =context.Users.Count(u => u.Password == hash); 
0

它看起来就像是一个shortcoming of LINQ to Entities

正如叶忒罗说,和上面的链接显示了一个例子,你需要将其转换为一些SQL知道。

相关问题