2016-03-23 10 views
0

Ich habe folgende Linq query:MD5 Passwort-Hashing in Linq Abfrage

bool exists = db.Users.Any(i => string.Compare(md5.ComputeHash(Encoding.ASCII.GetBytes(string.Concat(i.password, i.username))).ToString(), toCheck) == 0); 

Ich habe folgende Fehlermeldung:

Method 'Byte[] GetBytes(System.String)' has no supported translation to SQL. 
+3

Es gibt so viele Dinge in dieser Abfrage, die Sie nicht mit Entity Framework oder Linq-to-Sql tun kann, dass es auch nicht lustig :-) ist – xanatos

+0

ok .. dann können Sie einen Weg weisen tun es richtig? –

+1

Hängt davon ab, was du wirklich versuchst ... Es gibt mindestens zwei "moralisch falsche" Dinge in dem, was du geschrieben hast ... Du verwendest 'Encoding.ASCII' für einen Benutzernamen und ein Passwort (anstatt zum Beispiel mit UTF8), speichern Sie ein Passwort in Klartext auf der db ('i.Password') – xanatos

Antwort

0

die "AsEnumerable" Extension-Methode verwenden, wird der Inhalt der Kraft " Benutzer "Tabelle, die an Ihre Anwendung zurückgegeben werden soll, wobei der Rest des Ausdrucks ausgewertet wird. Dies vermeidet die Notwendigkeit, nur .net-Funktionen zu verwenden, die auch in SQL Server unterstützt werden.

bool exists = 
    db 
    .Users 
    .Select(
     user => 
      new 
      { 
       user.password, 
       user.username 
      }) 
    .AsEnumerable() 
    .Any(i => string.Compare(md5.ComputeHash(Encoding.ASCII.GetBytes(string.Concat(i.password, i.username))).ToString(), toCheck) == 0);