c# - 查询映射的 CustomObject 时出现 NullPointerException
问题描述
我有以下代码:
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);
}
}
查询本身工作正常,但一旦我尝试运行查询,我就会收到以下错误消息:
北 MySql.Data.MySqlClient.MySqlConnection.get_ServerThread()
北 MySql.Data.MySqlClient.MySqlConnection.Abort()
bei MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)
在 C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 1053 中的 Dapper.SqlMapper.ExecuteReaderWithFlagsFallback(IDbCommand cmd, Boolean wasClosed, CommandBehavior 行为)。
在 C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 1081 中找到 Dapper.SqlMapper.d__138`1.MoveNext()。
北 System.Collections.Generic.List
1..ctor(IEnumerable
1 个集合)bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)
C:\projects\dapper\Dapper\SqlMapper.cs:Zeile 723 中的Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable
1 commandTimeout, Nullable
1 commandType)。...Repository.GetByCityIDAndModuleID(Int64 cityID, Int64 moduleID)
...DeactivateModule(字符串模块ID)
但是我之前运行过多个这样的查询并且没有收到这个错误。这没有多大意义,因为没有任何使用过的东西真的是空的。
我已经通过 Visual Studio 进行了干净的构建和完整的重建。
有谁知道这个问题并知道如何解决它?
解决方案
正如评论中提到的,可以通过在调用 Query<>() 中分配“BaseModuleID”来修复 NullReferenceException,如下所示:
var _resultList = connection.Query<ActiveModule>(sqlStringBuilder.ToString(), new { CityID = cityID, BaseModuleID = moduleID }, null, true, null, null);
另一个建议:您调用 _resultList.Count() 两次。如果您的查询返回大量结果,这可能会很昂贵。由于您只处理列表中的第一项,因此您可以在列表中使用 FirstOrDefault() 而不是 Count()。或者,更好的是,您可以像这样在 MySqlConnection 上使用 QueryFirstOrDefault<>() :
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);
}
}
祝你好运!
推荐阅读
- c# - 异步方法似乎不等待,即使它在 C# 中包含“await”关键字
- html - 图像未从本地显示
- lodash - groupBy 和 value 作为 key
- powershell - 查询 PowerShell 优先级
- python - 从字典列表中获取多个列表
- flutter - Flutter,_shared 包是什么?
- dotnetnuke - 完成从 Dnn 9.1.1 升级到 9.3.0 后出现 HTTP 503 错误
- flutter - Flutter - 覆盖依赖项
- c# - 无法投射字典
从字典继承类 - microsoft-graph-api - 当我尝试获取外部用户共享的文件详细信息时返回“找不到项目”错误