Как проверить наличие нулевых значений с помощью Dapper

#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 только if stateId не равно 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.