我有以下代码:
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()
北MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为)
北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集合)bei System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)
北Dapper.SqlMapper.Query [T](IDbConnection cnn,字符串sql,对象 参数,IDbTransaction事务,布尔型缓冲,可空
1 commandTimeout, Nullable
1 commandType) C:\ projects \ dapper \ Dapper \ SqlMapper.cs:Zeile 723。... Repository.GetByCityIDAndModuleID(Int64 cityID,Int64 moduleID)
... DeactivateModule(字符串moduleID)
但是我之前正在运行多个类似的查询,但没有收到此错误。这没有什么意义,因为所用的东西中没有一个是真的为空。
我已经进行了干净的构建,并且还通过Visual Studio进行了完全重建。
有人知道这个问题并且知道如何解决吗?
答案 0 :(得分:1)
如评论中所述,可以通过在对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);
}
}
祝你好运!