У меня есть следующий код:
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 commandTimeout1 commandTimeout, Nullable
1 commandType) в C:\projects\dapper\Dapper\SqlMapper.cs: Zeile 723.... Repository.GetByCityIDAndModuleID(Int64 cityID, Int64 moduleID)
... DeactivateModule (String moduleID)
Но я выполняю несколько запросов, подобных этому, и не получаю эту ошибку. Это не имеет особого смысла, потому что ничто из использованного материала не является действительно нулевым.
Я уже сделал чистую сборку, а также полную перестройку через Visual Studio.
Кто-нибудь знает об этой проблеме и знает, как ее исправить?
Как уже упоминалось в комментариях, исключение 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);
}
}
Удачи!