我正在尝试编写一个异步方法,该方法从我的存储库中的EF核心返回单个对象。我有以下方法:
public async Task<Administrator> GetOne(Guid guid)
{
var admin = await _ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid);
return admin;
}
但是这会产生以下编译时错误:
无法将表达式类型TResult转换为返回类型Administrator
如果我将其更改为以下代码(即没有OrDefault),我没有遇到任何问题:
public async Task<Administrator> GetOne(Guid guid)
{
var admin = await _ctx.Users.SingleAsync(u => u.Guid == guid);
return admin;
}
我做错了什么?
还有第二点,首先是代码是否正确,或者我应该在没有等待的情况下返回结果。
public Task<Administrator> GetOne(Guid guid)
{
return _ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid);
}
答案 0 :(得分:3)
我将其更改为以下代码(即没有OrDefault)我没有遇到任何问题。
我做错了什么?
您应该尝试以下命令强制编译器将返回类型值和转换为Administrator
ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid) as Administrator;
注意:
如果有一个用户提供了id但是无法将其转换为Administrator实例,则上面的代码返回null。
如果你想在这种情况下抛出异常,你可以使用经典的&#39;演员:
(Administrator) ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid);
还有第二点,首先是代码是否正确,或者我应该在没有等待的情况下返回结果
我的猜测是你想在这里等待你的代码。最终,只有你真的知道,但我看不出有任何明显的理由不这样做,而且很多理由等待它。
如果你没有await
,那么你的功能可能还没有完成,而你的其余调用代码可能取决于实际的Administrator
结果。
答案 1 :(得分:0)
此方法签名:public async Task<Administrator> GetOne(Guid guid)
应返回Task<Administrator>
。
ctx.Users.SingleOrDefaultAsync
来电未返回Task<Administrator>
。
至于你的第二点:如果你不需要结果,只需返回Task
。