2012-07-11 5 views
0

문자열을 해시하고 (이 경우 내 로그인) linq 코드를 작성한 다음 내 데이터베이스에서 찾아야합니다. 해시 로그인 후 linq을 사용하여 검색하십시오.

내가 시도 :

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

내가 때문에 해시 코드의 오류가 발생했습니다. 나는 foreach를 가진 나의 명부 전부를 읽지 않을 것입니다. 한 줄의 코드로 그렇게 할 수 있는지 궁금합니다. 감사합니다.

편집 : 그렇게 할 방법을 찾았지만 예상 한만큼 가볍지 않습니다. 데이터베이스의 데이터가 이미 해시되어 u.Login 현재 사용자의 로그인의 값이면

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

+0

아아, 알겠습니다. 'u.Login'은 일치시키려는 해시 된 로그인입니다. unhashed 로그인은 데이터베이스에 저장됩니다. 문제는 'HashHelper.HashCode'는 TSQL에 대한 명백한 변환이 없으므로 모든 ORM이이를 SQL로 변환 할 수 없다는 것입니다. 이게 옳은 거니? – Jodrell

+1

당신의 편집은 모든 사용자를 클라이언트로 끌어 들이고 'HashHelper.HashCode'가 평가 될 수있는 비교를합니다. 많은 사용자가없는 경우 (약 1000 개 이상)이 방법이 가장 간단한 방법 일 것입니다. – Jodrell

답변

1

사용자가 너무 많지 않은 경우 다음과 같이 한 줄로 입력 할 수 있습니다.

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

중요한 비트는 EF 부분을 평가하고 나머지 LINQ - 투 - 객체를 만드는 ToList()입니다. 즉, 비교가 클라이언트에서 수행되고 모든 사용자가 서버에서 검색됩니다. 그것은 귀하의 편집과 동일합니다.

성능에 문제가있는 경우 해시 코드를 데이터베이스에도 저장해야합니다.

0

, 그때는 아마 이런 식으로 그것을 할 수 :

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(); 

정말하지 않습니다 당신이 성취하고자하는 것에 대해 많이 알고 있기 때문에, 이것이 실제로 도움이된다면 나는 즐겁게 놀랄 것입니다. 행운을 빕니다!

관련 문제