Dapper多映射异步扩展

Ljt*_*Ljt 5 c# dapper asp.net-core

下面是我在dapper中进行多映射(一对多关系)的扩展

public static IEnumerable<TParent> QueryParentChild<TParent, TChild, TParentKey>(
    this IDbConnection connection,
    string sql,
    Func<TParent, TParentKey> parentKeySelector,
    Func<TParent, IList<TChild>> childSelector,
    dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)
{
    Dictionary<TParentKey, TParent> cache = new Dictionary<TParentKey, TParent>();

    connection.Query<TParent, TChild, TParent>(
        sql,
        (parent, child) =>
            {
                if (!cache.ContainsKey(parentKeySelector(parent)))
                {
                    cache.Add(parentKeySelector(parent), parent);
                }

                TParent cachedParent = cache[parentKeySelector(parent)];
                IList<TChild> children = childSelector(cachedParent);
                children.Add(child);
                return cachedParent;
            },
        param as object, transaction, buffered, splitOn, commandTimeout, commandType);

    return cache.Values;
}
Run Code Online (Sandbox Code Playgroud)

现在我想将其转换为异步方法.我尝试过很多方法.但是有些错误......请告诉我需要做的改变

Dav*_*ine 2

您是否尝试过类似的操作,请参见下文:

public static async Task<IEnumerable<TParent>> QueryParentChildAsync<TParent, 
                                                                     TChild, 
                                                                     TParentKey>(
    this IDbConnection connection,
    string sql,
    Func<TParent, TParentKey> parentKeySelector,
    Func<TParent, IList<TChild>> childSelector,
    dynamic param = null, 
    IDbTransaction transaction = null, 
    bool buffered = true, 
    string splitOn = "Id", 
    int? commandTimeout = null, 
    CommandType? commandType = null)
{
    var cache = new Dictionary<TParentKey, TParent>();

    await connection.QueryAsync<TParent, TChild, TParent>(
        sql,
        (parent, child) =>
            {
                var key = parentKeySelector(parent);
                if (!cache.ContainsKey(key ))
                {
                    cache.Add(key, parent);
                }    
                var cachedParent = cache[key];
                var children = childSelector(cachedParent);
                children.Add(child);
                return cachedParent;
            },
        param as object, 
        transaction, 
        buffered, 
        splitOn, 
        commandTimeout, 
        commandType);

    return cache.Values;
}
Run Code Online (Sandbox Code Playgroud)

  • 你能提供一个如何调用这个函数的例子吗?还收到了通过返回 Task&lt;IEnumerable&lt;TParent&gt;&gt; 而不仅仅是 IEnumerable&lt;TParent&gt; 纠正的错误 (2认同)