C# Dapper中是否有为QueryFirstAsync或QueryFirstDefaultAsync执行多重映射的选项?
我正在尝试将对象从sql映射到C#中的多个对象。在使用QueryFirstAsync和QueryFirstOrDefaultAsync的情况下,如何进行多重映射 我在QueryAsync或Query中尝试过类似的过程C# Dapper中是否有为QueryFirstAsync或QueryFirstDefaultAsync执行多重映射的选项?,c#,sql-server,dapper,C#,Sql Server,Dapper,我正在尝试将对象从sql映射到C#中的多个对象。在使用QueryFirstAsync和QueryFirstOrDefaultAsync的情况下,如何进行多重映射 我在QueryAsync或Query中尝试过类似的过程 ClassA record = await this.dbConnection.QueryFirstAsync<ClassA, ClassB, ClassA>( sql, (a, b) => { a.Id = b.Id;
ClassA record =
await this.dbConnection.QueryFirstAsync<ClassA, ClassB, ClassA>(
sql,
(a, b) =>
{
a.Id = b.Id;
return a;
},
splitOn: "Id",
param: new
{
memberId
});
ClassA记录=
等待this.dbConnection.QueryFirstAsync(
sql,
(a,b)=>
{
a、 Id=b.Id;
返回a;
},
斯普利顿:“身份证”,
param:新的
{
memberId
});
我希望生成成功,但它不适用于QueryFirstAsync或QueryFirstDefaultAsync
当前问题:
您正在尝试对dapper函数、QueryFirstAsync
和QueryFirstDefaultAsync
使用多重映射,但它们的重载都不支持由QueryAsync
粘贴dapper代码中的定义所完成的多重映射:
public static Task<IEnumerable<TReturn>> QueryAsync<TFirst, TSecond, TReturn>(this IDbConnection cnn,
CommandDefinition command, Func<TFirst, TSecond, TReturn> map, string splitOn = "Id") =>
MultiMapAsync<TFirst, TSecond, DontMap, DontMap, DontMap, DontMap, DontMap, TReturn>(cnn,
command, map, splitOn);
解决方案:
使用标准的
QueryAsync
,它有一个重载,在最后的结果调用FirstorDefault
时使用SplitOn
,因为Dapper查询的结果是IEnumerable
,因此,可以调用任何标准Linq扩展方法生成错误是什么?还可以使用多映射调用querySync
,在结果调用FirstOrDefault()
,这样就不会有任何编译了issues@MrinalKamboj你的建议解决了我的问题。非常感谢。我已经发布了详细的答案相同,你可以接受它,因为问题的立场解决使用的解决方案
private static async Task<IEnumerable<TReturn>> MultiMapAsync<TReturn>(this IDbConnection cnn, CommandDefinition command, Type[] types, Func<object[], TReturn> map, string splitOn)
{
if (types.Length < 1)
{
throw new ArgumentException("you must provide at least one type to deserialize");
}
object param = command.Parameters;
var identity = new Identity(command.CommandText, command.CommandType, cnn, types[0], param?.GetType(), types);
var info = GetCacheInfo(identity, param, command.AddToCache);
bool wasClosed = cnn.State == ConnectionState.Closed;
try
{
if (wasClosed) await cnn.TryOpenAsync(command.CancellationToken).ConfigureAwait(false);
using (var cmd = command.TrySetupAsyncCommand(cnn, info.ParamReader))
using (var reader = await ExecuteReaderWithFlagsFallbackAsync(cmd, wasClosed, CommandBehavior.SequentialAccess | CommandBehavior.SingleResult, command.CancellationToken).ConfigureAwait(false))
{
var results = MultiMapImpl(null, default(CommandDefinition), types, map, splitOn, reader, identity, true);
return command.Buffered ? results.ToList() : results;
}
}
finally
{
if (wasClosed) cnn.Close();
}
}