1 回答

TA貢獻1801條經驗 獲得超8個贊
當前的問題:
您正在嘗試將多重映射與 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值創建多地圖默認值是Id
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();
}
}
解決方案:
使用 standard QueryAsync,它有一個重載,SplitOn在最終結果調用上采用 和FirstorDefault,因為 Dapper 查詢的結果是IEnumerable<T>,因此可以調用任何標準 Linq 擴展方法
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報