NullPointerException при запросе сопоставленного CustomObject - PullRequest
0 голосов
/ 20 апреля 2019

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

        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, Boolean 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 коллекция)

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

bei Dapper.SqlMapper.Query [T] (IDbConnection cnn, String sql, Object параметр, транзакция IDbTransaction, логический буфер, Nullable 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 Ответ

1 голос
/ 20 апреля 2019

Как упоминалось в комментариях, исключение 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);
        }
    }

Удачи!

...