Верните значение true или false из хранимой процедуры в SQL и используйте его в asp core3 с dapper - PullRequest
0 голосов
/ 11 января 2020

У меня есть эта хранимая процедура для проверки некоторой информации, мне нужно, чтобы эта хранимая процедура нашла значение, а затем вернула true, а если ничего не нашла, то вернула false.

ALTER PROCEDURE [dbo].[ValidateSubscribeDiscountDate]
    (@StartDate datetimeoffset,
     @EndDate datetimeoffset)
AS
BEGIN
    SELECT
        1
    FROM 
        [SubscribeDiscount] SD
    WHERE 
        SD.StartDate = @StartDate
        AND SD.EndDeate = @EndDate
END

Я использую это в ASP. NET Core MVC приложении вроде этого:

public async Task<OperationResult<bool>> ValidateSubscribeDiscount(DateTimeOffset? StartDate, DateTimeOffset? EndDate)
{
        using (var userConnection = new SqlConnection(ConnectionString))
        {
            try
            {
                var validate = await userConnection.QueryAsync<bool>(
                    "ValidateSubscribeDiscountDate",
                    new { StartDate = StartDate, EndDate = EndDate }
                    );
                var response = validate.First();

                return OperationResult<bool>.BuildSuccessResult(vlaidate.First()); 
            }
            catch (Exception ex)
            {
                return OperationResult<bool>.BuildFailure(ex.Message);
            }
        }
}

но я получаю эту ошибку:

Последовательность не содержит элементов

В чем проблема? Как я могу решить эту проблему?

1 Ответ

1 голос
/ 11 января 2020

Ваш код не выполняется, потому что вы используете 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();
...