Я использую C # и .Net 4.0 с MS SQL 2008.
Я запускаю интеграционный тест, чтобы убедиться, что данные правильно хранятся и извлекаются. Это терпит неудачу чаще, чем нет. Когда я смотрю в это, я вижу, что я получаю неправильное значение назад от вызова linq-to-sql. Я профилировал оператор linq-to-sql и обнаружил, что в Server Management Studio профилированный SQL возвращает неправильное значение, в то время как запрос, набранный вручную с теми же параметрами, работает правильно.
Запрос linq-to-sql и результат:
exec sp_executesql N'SELECT TOP (1) [t0].[ID], [t0].[UserName], [t0].TCID
FROM [dbo].[Users] AS [t0]
WHERE ([t0].[TCID] = @p0) AND ([t0].[UserName] = @p1)',N'@p0 int,@p1
nvarchar(4000)',@p0=8,@p1=N'ҭРӱґѻ'
Результаты в
ID UserName TCID
2535 ҭРґѻӱ 8
Как видите, UserName не соответствует тому, что было в проверке равенства.
Если я сделаю это, я получу ожидаемый результат:
SELECT TOP 1000 [ID]
,[UserName]
,[TCID]
FROM [dbo].[Users]
where TCID=8 and username = 'ҭРӱґѻ'
Я вернусь:
ID UserName TCID
Что правильно.
UserName - это nvarchar (50), ID и TCID - это int.
Есть идеи, почему первый запрос дает неправильный результат?