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 声明有关:
- 您指定要拆分的列不能是 SELECT 语句中的第一列
- 您的拆分列之后列出的任何列都不会被映射
只需将我的 DateTime
列移动到 SELECT 语句中拆分列的上方即可解决问题。
运行 变成了一个奇怪的问题,其中来自 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 声明有关:
- 您指定要拆分的列不能是 SELECT 语句中的第一列
- 您的拆分列之后列出的任何列都不会被映射
只需将我的 DateTime
列移动到 SELECT 语句中拆分列的上方即可解决问题。