Это связано с тем, что запрос @ 0 оценивается как буквальное значение параметра, а не как имя столбца таблицы - например.если @ 0 - это «Имя пользователя», соответствующая часть запроса обрабатывается как ROW_NUMBER() OVER(ORDER BY 'Username' DESC)
, а не ROW_NUMBER() OVER(ORDER BY Username DESC)
.
Поэтому номер строки всегда оценивается как 1.
Поэтому решение заключается в том, чтобы вставить значение @ 0 в строку запроса, а не рассматривать его как параметр связывания.(Этот подход обычно не рекомендуется из-за риска атак SQL вставки, но, учитывая, что вы должны быть в состоянии гарантировать, что доступные значения @ 0 будут действительны, он должен быть подходящим в этом случае .)
РЕДАКТИРОВАТЬ: альтернативный подход - вместо использования динамического SQL, если вы не можете гарантировать, что @ 0 будет должным образом очищены, то вы можете использовать вместо этого предложение case:
var accounts = database.Query(
@"SELECT Username, Email, row_count FROM
(SELECT Username,
Email,
Count(0) OVER() as row_count,
ROW_NUMBER() OVER(ORDER BY row_group DESC) as row_number
FROM (SELECT Username,
Email,
CASE @0
WHEN 'Username' THEN Username
WHEN 'Email' THEN Email
/* insert other valid cases here */
END as row_group
FROM UserProfile
WHERE Username LIKE '%'+@1+'%' AND Email LIKE '%'+@2+'%') u
) as accounts
WHERE row_number BETWEEN @3 AND @4",
new object[] { sort, username, email, start, end });