首页 > 解决方案 > 如何将 linq 输出的类型转换为函数的返回类型

问题描述

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

 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;

        }

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

错误 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 以返回正确的类型,或者真的有任何其他想法?

标签: c#linqasync-awaitbackend

解决方案


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

但是,您也可以Task不返回,在这种情况下,除了添加到调用方法ConfigureAwait(false)之外,不需要做任何事情。ConfigureAwait()

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

var info = await GetUserContactInfo(token).ConfigureAwait(false);

在这种情况下,由于您没有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);
        }

推荐阅读