#c# #.net #dapper
#c# #.net #dapper
Вопрос:
У меня есть таблица SQL Countries с идентификатором страны и идентификатором состояния. StateID может быть нулевым, поскольку не во всех странах есть состояния. Я хотел бы проверить, существует ли в таблице комбинация country / state. Если у меня есть страна «NL» и состояние NULL в таблице, и я использую следующий запрос, где CountryId = «NL» и StateID = null:
return await conn.ExecuteScalarAsync<bool>(@"SELECT COUNT(*)
FROM [dbo].[Countries]
WHERE [CountryId] = @CountryId
AND [StateId] = @StateId",
new { countryId, stateId });
Он вернет false. Я ожидал истинного ответа. Может ли кто-нибудь объяснить это поведение и каков наилучший подход к решению этой проблемы?
Комментарии:
1.Именно так работает SQL. Это не имеет ничего общего с Dapper, или C #, или .NET. Если вы это сделаете
[StateId] = NULL
, вы не получите никаких результатов — проверьте это сами в SSMS (или в выбранном вами SQL-клиенте). Вам нужно включитьAND [StateId] = @StateId
только ifstateId
не равно null (или проверьте ответ ниже, если вы явно заинтересованы в том, чтобы он былnull
).
Ответ №1:
Это не проблема Dapper. Сравнение чего-либо с NULL с помощью оператора = обычно возвращает false . Вам нужно будет использовать «is null» для сравнения, т.е.
AND [StateId] is null
(по крайней мере, на SQL Server). Это, конечно, означает, что ваш запрос должен будет выглядеть по-другому, если stateid равен null.
Комментарии:
1. Возможно, вам подойдет какой-нибудь пример кода на C #?
Ответ №2:
Проверьте это:
SELECT COUNT(*)
FROM [dbo].[Countries]
WHERE [CountryId] = @CountryId
AND ([StateId] IS NULL OR ([StateId] IS NOT NULL AND [StateId] = @StateId))
Он проверит, есть ли StateId
null
, тогда будет проверен только «идентификатор страны» для тех стран, в которых нет государства, если StateId
нет null
, то StateId
тоже будет проверен
Комментарии:
1.
[StateId] IS NOT NULL AND
не требуется. Это удлиняет запрос без существенной выгоды (т. Е. Не Влияет на результаты). Кроме того, если вы передадите значение@StateId
, оно вернет значения с этим значением или null , которые, как я подозреваю, не соответствуют ожиданиям OP.