查询映射的CustomObject

时间:2019-04-20 15:18:13

标签: c# mysql dapper

我有以下代码:

        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进行了完全重建。

有人知道这个问题并且知道如何解决吗?

1 个答案:

答案 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);
        }
    }

祝你好运!