Linq To Entities异常无法识别该方法且无法转换为商店表达式

时间:2011-07-13 08:22:36

标签: c# linq-to-entities

有人可以解释为什么我的LINQ代码会出现此错误吗?

  

LINQ to Entities无法识别方法'System.String   GenerateHashWithSalt(System.String,System.String)'方法和这个   方法无法转换为商店表达式。

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

3 个答案:

答案 0 :(得分:14)

您正在尝试将方法传递给EF,该方法尝试将该方法转换为已知的SQL命令。 SQL不了解GenerateHashWithSalt(System.String, System.String)
您应该首先将结果分配给变量,然后生成Linq to Entity Query。

例子

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

答案 1 :(得分:0)

LINQ提供程序查看表达式树,并尝试从中生成等效的TSQL(等)。这仅适用于已识别的方法或已识别的表达式方案。

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

然而!您可以简化查询:

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

答案 2 :(得分:0)

看起来好像是shortcoming of LINQ to Entities

正如Jethro所说,上面的链接显示了一个示例,您需要将其转换为SQL知道的内容。