2012-07-11 75 views
0

我正在写一段代码与linq必须散列一个字符串(在这种情况下,我的登录),然后尝试找到它到我的数据库。哈希登录,然后用LINQ搜索

我想:

var userFind = context.Users.FirstOrDefault(user =>HashHelper.HashCode(user.Login).Equals(u.Login)); 

我因为的hashCode错误。 我不会用foreach阅读我的所有列表。我想知道是否可以用一行代码来完成。 此致敬礼。

编辑:我找到了一个办法,但它没有我想象的那么轻。

User userFind = null; 
      foreach (var user in context.Users) 
      { 
       string hashedLogin = HashHelper.HashCode(user.Login); 
       if(hashedLogin.Equals(u.Login)) 
       { 
        userFind = user; 
       } 
      } 
+0

什么是'u.Login',为什么要从数据库中散列值? – Jodrell 2012-07-11 09:28:03

+0

啊,我看到了,所以'u.Login'是一个你想匹配的哈希登录。非哈希登录存储在数据库中。您遇到的问题是'HashHelper.HashCode'没有明显的TSQL翻译,因此任何ORM都无法将其转换为SQL。这是正确的吗? – Jodrell 2012-07-11 09:59:55

+1

您的编辑会将所有用户拉到客户端,并执行可以评估“HashHelper.HashCode”的比较。如果你没有很多用户(1000+左右),这可能是最简单的解决方案。 – Jodrell 2012-07-11 10:10:42

回答

1

如果你没有太多的用户,你可以在一行这样做。

var userFind = context.Users.ToList().FirstOrDefault(
    user => HashHelper.HashCode(user.Login).Equals(u.Login)) 

最重要的一点是评估EF部分,使其余的LINQ到对象ToList()。这意味着比较将在客户端完成,所有用户将从服务器中检索。它相当于你的编辑。

如果性能问题,您应该将哈希码存储在数据库中。

0

如果在数据库中的数据已经被散列和u.Login是当前用户的登录的价值,那么你也许可以做这样的:

var hashedLogin = HashHelper.HashCode(u.Login); // hash the value in the app so it can be compared to already hashed values in database. 
var userFind = context.Users.Where(user => user.Login == hashedLogin).FirstOrDefault(); 

我真的不非常了解你想要达到的目标,所以如果真的有帮助,我会很惊喜。祝你好运!