C# Dapper中是否有为QueryFirstAsync或QueryFirstDefaultAsync执行多重映射的选项?

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;

我正在尝试将对象从sql映射到C#中的多个对象。在使用QueryFirstAsync和QueryFirstOrDefaultAsync的情况下,如何进行多重映射

我在QueryAsync或Query中尝试过类似的过程

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();
            }
        }