亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有選項可以在 Dapper 中為 QueryFirstAsync

是否有選項可以在 Dapper 中為 QueryFirstAsync

C#
森林海 2023-09-09 16:41:31
我正在嘗試將對象從 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});我期望構建成功,但它不適用于 QueryFirstAsync 或 QueryFirstOrDefaultAsync。
查看完整描述

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 擴展方法


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 153 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號