蝴蝶刀刀
当前的问题:您正在尝试将多重映射与 dapper 函数QueryFirstAsync和 一起使用QueryFirstOrDefaultAsync,但它们的重载都不支持 Mutli-Mapping,如 所做的那样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);它调用MultiMapAsync,它利用该SplitOn值创建多地图默认值是Idprivate 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(); } }解决方案:使用 standard QueryAsync,它有一个重载,SplitOn在最终结果调用上采用 和FirstorDefault,因为 Dapper 查询的结果是IEnumerable<T>,因此可以调用任何标准 Linq 扩展方法