c# - 如何将 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 以返回正确的类型,或者真的有任何其他想法?
解决方案
ConfigureAwait
回报ConfiguredTaskAwaitable
,不是Task
。您需要使用关键字显式等待await
,并将该方法更改为async
.
但是,您也可以Task
不返回,在这种情况下,除了添加到调用方法ConfigureAwait(false)
之外,不需要做任何事情。ConfigureAwait()
因此,只需users.ToListAsync(cancellationToken);
从该方法返回并调用它:
var info = await GetUserContactInfo(token).ConfigureAwait(false);
在这种情况下,由于您没有await
在该方法内部使用,因此不需要ConfigureAwait
after 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);
}
推荐阅读
- ios - 应用程序的 Apple Keystore 文件
- anylogic - 在anylogic中设置drop-off block
- tcp - SOCKS5 认证 0x84
- amazon-dynamodb - 如何添加/更新 DynamoDB 条目,创建或附加到列表属性?
- json - 如何访问 json 列表中的数据以构建 Angular CDK 数据表
- c - 带有 & 操作的 uint64_t 变量
- angular - 角度 2 类型脚本错误 - TS2322
- unity3d - UI ButtonCallBack 和恢复按钮不起作用?
- drop-down-menu - 引导选择在下拉菜单中无法正常工作
- django - 在 Django 模板中将字符串转换为整数