Dapper 停止使用多映射映射 DateTime 值

Dapper stops mapping DateTime values with Multi-Mapping

运行 变成了一个奇怪的问题,其中来自 Sql 服务器数据库映射的 DateTime 值使用简单查询就可以了,但是如果我引入多重映射,它就会停止工作。通过停止工作,我的意思是如果 .NET 属性 是 DateTime,它将是 default,如果它是 DateTime? 类型,它将是 null。

我试过我的代码,这会起作用:

IEnumerable<TReturnModel> modelList = await SqlMapper.QueryAsync<TReturnModel>(
                conn,
                sql: command.CommandText,
                //map: (Func<object[], TReturnModel>)((objs) =>
                //{
                //    var model = objs[0] as TReturnModel;

                //    if (model != null)
                //    {
                //        var modelHash = CheckSumHelper.CreateCheckSum(model);

                //        if (objTracking.ContainsKey(modelHash))
                //        {
                //            objs[0] = objTracking[modelHash];
                //        }
                //        else
                //        {
                //            objTracking.Add(modelHash, model);
                //        }
                //    }

                //    return command.HandleSplitMapping(objs) as TReturnModel;
                //}),
                //types: command.GetType().GetGenericArguments(),
                //splitOn: string.Join(',', command.GetDataSplitters()),
                param: command.Parameters);

但这不会:

IEnumerable<TReturnModel> modelList = await SqlMapper.QueryAsync<TReturnModel>(
                conn,
                sql: command.CommandText,
                map: (Func<object[], TReturnModel>)((objs) =>
                {
                    var model = objs[0] as TReturnModel;

                    if (model != null)
                    {
                        var modelHash = CheckSumHelper.CreateCheckSum(model);

                        if (objTracking.ContainsKey(modelHash))
                        {
                            objs[0] = objTracking[modelHash];
                        }
                        else
                        {
                            objTracking.Add(modelHash, model);
                        }
                    }

                    return command.HandleSplitMapping(objs) as TReturnModel;
                }),
                types: command.GetType().GetGenericArguments(),
                splitOn: string.Join(',', command.GetDataSplitters()),
                param: command.Parameters);

我对删除的代码进行了注释,以证明唯一的区别是删除了多映射参数。

似乎有(似乎没有成文,因为我在网上找不到任何东西)规则与我在试图解决这个问题时发现的 SQL 声明有关:

  1. 您指定要拆分的列不能是 SELECT 语句中的第一列
  2. 您的拆分列之后列出的任何列都不会被映射

只需将我的 DateTime 列移动到 SELECT 语句中拆分列的上方即可解决问题。