Я профилировал это через db.Log = Console.Out
, с результатом:
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
select * from Users where Login = @p0 and PasswordHash = HashBytes('SHA1', @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Admiral Trask]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Arutha]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
Глядя на это, я представляю проблема в том, что параметр равен NVarChar
, а не varchar
- поэтому взятие хэша (двоичная операция) отличается Если вы хэшировали как varchar
, вам, вероятно, следует привести строку к varchar
перед HASHBYTES
.
Следующие работы, например:
var user = db.ExecuteQuery<User>(@"select * from Users where Login = {0}
and PasswordHash = HashBytes('SHA1', CAST({1} as varchar(40)))", cn, pw)
.SingleOrDefault();
Более простая иллюстрация этого:
SELECT HASHBYTES('SHA1','12345'), HASHBYTES('SHA1',N'12345')