Ваш код не выполняется, потому что вы используете First, если результат запроса не содержит записей, возвращаемых предложением WHERE. Сначала предполагается, что в вашем IE всегда есть что-то, что можно вернуть. Вы можете изменить хранимую процедуру, чтобы она всегда возвращала значение, а затем проверять это значение из вашего C# кода
ALTER PROCEDURE [dbo].[ValidateSubscribeDiscountDate]
(
@StartDate datetimeoffset,
@EndDate datetimeoffset
)
AS
BEGIN
IF EXISTS(SELECT 1 FROM [SubscribeDiscount] SD
WHERE SD.StartDate =@StartDate
AND SD.EndDeate=@EndDate)
SELECT 1 ELSE SELECT 0
END
...
var vlaidate = await userConnection.QueryAsync<int>(
"ValidateSubscribeDiscountDate",new
{ StartDate = StartDate, EndDate = EndDate });
bool response = vlaidate.First() == 1 ? true : false;
Но, вероятно, лучше всего использовать вместо FirstOr FirstOrDefault. С помощью этого метода вы получите нулевое возвращение, если запрос не даст никакого результата, и вы можете легко проверить это условие.
var vlaidate = await userConnection.QueryAsync<int>(
"ValidateSubscribeDiscountDate",new
{ StartDate = StartDate, EndDate = EndDate });
bool response = vlaidate.FirstOrDefault() != null ? true : false;
или, как указано здесь ниже, подойдет даже простой вызов Any.
bool response = vlaidate.Any();