如何将 linq 输出的类型转换为函数的返回类型

מלך*_*שיח 1 c# linq backend async-await

我有一个看起来像这样的函数:

 Task<IEnumerable<User>> GetUserContactInfo(
            CancellationToken cancellationToken = new CancellationToken()
               )
        {
                var users = from u in _userDbContext.Users
                        join ur in _userDbContext.UserRoles on u.Id equals ur.UserId
                        select u;
            var u2 = users.ToListAsync(cancellationToken).ConfigureAwait(false);

            return u2;

        }
Run Code Online (Sandbox Code Playgroud)

但是..试图编译它给了我这个错误:

错误 CS0029 无法将类型隐式转换 'System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.Collections.Generic.List <IPD.Identity.Domain.Aggregates.UserAggregate.User>>''System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<IPD.Identity.Domain.Aggregates.UserAggregate.User>>'

关于如何转换为函数的返回类型的任何想法,或者将某些东西附加到 linq 以返回正确的类型,或者真的有任何其他想法?

Far*_*yev 5

ConfigureAwait返回ConfiguredTaskAwaitable,不是Task。您需要使用await关键字显式地等待该方法,并将该方法更改为async.

但是,您也可以直接返回,在这种情况下,除了添加到调用方法之外,Task无需执行ConfigureAwait(false)任何操作ConfigureAwait()

因此,只需users.ToListAsync(cancellationToken);从该方法返回并调用它:

var info = await GetUserContactInfo(token).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于您没有await在该方法内部使用,因此不需要ConfigureAwaitafter ToListAsync()

更新评论:

顺便说一句,由于函数的返回类型是Task<IEnumerable<...>,您将无法返回Task<List<...>>。因为,Task<>不是协变类型。为了解决该问题,您可以将返回类型更改为Task<List<...>>.

所以结果可能是这样:

Task<List<User>> GetUserContactInfo(CancellationToken cancellationToken = new CancellationToken())
        {
            var users = from u in _userDbContext.Users
                        join ur in _userDbContext.UserRoles on u.Id equals ur.UserId
                        select u;
            return users.ToListAsync(cancellationToken);
        }
Run Code Online (Sandbox Code Playgroud)