NullPointerException при запросе сопоставленного CustomObject

0

У меня есть следующий код:

        ActiveModule resultObject = null;

        StringBuilder sqlStringBuilder = new StringBuilder();
        sqlStringBuilder.AppendLine("SELECT * FROM suite_activemodule as _module");
        sqlStringBuilder.AppendLine("WHERE CityID = @CityID AND BaseModuleID = @BaseModuleID");

        using (MySqlConnection connection = new MySqlConnection(ConnectionString))
        {
            var _resultList = connection.Query<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, ModuleID = moduleID }, null, true, null, null); //<- This is were I get the error...
            int listSize = _resultList.Count();
            if (_resultList != null && !_resultList.Count().Equals(0))
            {
                resultObject = _resultList.ToList().First();
                resultObject.Module = BaseModuleRepository.GetByID(resultObject.ModuleID);
            }
        }

Сам запрос работает нормально, но как только я пытаюсь выполнить запрос, я получаю следующее сообщение об ошибке:

bei MySql.Data.MySqlClient.MySqlConnection.get_ServerThread()

bei MySql.Data.MySqlClient.MySqlConnection.Abort()

bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (поведение CommandBehavior)

bei Dapper.SqlMapper.ExecuteReaderWithFlagsFallback(IDbCommand cmd, логическое значение wasClosed, поведение CommandBehavior) в C:\projects\dapper\Dapper\SqlMapper.cs: Zeile 1053.

bei Dapper.SqlMapper.d__138'1.MoveNext() в C:\projects\dapper\Dapper\SqlMapper.cs: Zeile 1081.

bei System.Collections.Generic.List 1..ctor(IEnumerable 1 collection)

bei System.Linq.Enumerable.ToList [TSource] (источник IEnumerable'1)

bei Dapper.SqlMapper.Query [T] (IDbConnection cnn, Строка sql, Параметр объекта, Транзакция IDbTransaction, Логический 1 commandTimeout, Nullable 1 commandTimeout 1 commandTimeout, Nullable 1 commandType) в C:\projects\dapper\Dapper\SqlMapper.cs: Zeile 723.

... Repository.GetByCityIDAndModuleID(Int64 cityID, Int64 moduleID)

... DeactivateModule (String moduleID)

Но я выполняю несколько запросов, подобных этому, и не получаю эту ошибку. Это не имеет особого смысла, потому что ничто из использованного материала не является действительно нулевым.

Я уже сделал чистую сборку, а также полную перестройку через Visual Studio.

Кто-нибудь знает об этой проблеме и знает, как ее исправить?

  • 1
    Не уверен, что это имеет какое-то значение, но вы не открываете соединение
  • 0
    Кроме того, последние четыре параметра Query <T> являются необязательными, и вы передаете значения по умолчанию. Вы можете опустить их.
Показать ещё 3 комментария
Теги:
dapper

1 ответ

1
Лучший ответ

Как уже упоминалось в комментариях, исключение NullReferenceException можно исправить, назначив "BaseModuleID" в вашем вызове для Query <>() следующим образом:

var _resultList = connection.Query<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, BaseModuleID = moduleID }, null, true, null, null);

Еще одно предложение: вы вызываете _resultList.Count() дважды. Если ваш запрос возвращает большое количество результатов, это может быть дорого. Поскольку вы обрабатываете только первый элемент в списке, вы можете использовать FirstOrDefault() в списке вместо Count(). Или, что еще лучше, вы можете использовать QueryFirstOrDefault <>() в MySqlConnection следующим образом:

    ActiveModule resultObject = null;
    StringBuilder sqlStringBuilder = new StringBuilder();
    sqlStringBuilder.AppendLine("SELECT * FROM suite_activemodule as _module");
    sqlStringBuilder.AppendLine("WHERE CityID = @CityID AND BaseModuleID = @BaseModuleID");

    using (MySqlConnection connection = new MySqlConnection(ConnectionString))
    {
        resultObject = connection.QueryFirstOrDefault<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, BaseModuleID = moduleID });            
        if (resultObject != null)
        {
            resultObject.Module = BaseModuleRepository.GetByID(resultObject.ModuleID);
        }
    }

Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню