EF Core SingleOrDefaultAsync编译时返回类型错误

时间:2018-04-19 09:46:33

标签: c# linq async-await entity-framework-core

我正在尝试编写一个异步方法,该方法从我的存储库中的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);
}

2 个答案:

答案 0 :(得分:3)

如何解决编译错误:

  

我将其更改为以下代码(即没有OrDefault)我没有遇到任何问题。

     

我做错了什么?

您应该尝试以下命令强制编译器将返回类型值转换为Administrator

的可能默认(null)类型
 ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid) as Administrator;

注意:

如果有一个用户提供了id但是无法将其转换为Administrator实例,则上面的代码返回null。

如果你想在这种情况下抛出异常,你可以使用经典的&#39;演员:

 (Administrator) ctx.Users.SingleOrDefaultAsync(u => u.Guid == guid);

关于&#39;等待&#39;或者&#39;不等待&#39;

  

还有第二点,首先是代码是否正确,或者我应该在没有等待的情况下返回结果

我的猜测是你想在这里等待你的代码。最终,只有你真的知道,但我看不出有任何明显的理由不这样做,而且很多理由等待它。

如果你没有await,那么你的功能可能还没有完成,而你的其余调用代码可能取决于实际的Administrator结果。

答案 1 :(得分:0)

此方法签名:public async Task<Administrator> GetOne(Guid guid)应返回Task<Administrator>

ctx.Users.SingleOrDefaultAsync来电未返回Task<Administrator>

至于你的第二点:如果你不需要结果,只需返回Task