LINQ 的 Any 方法能够返回 Task<bool> 吗?

4

I have this interface :

public interface ISign
{
   Task<bool> IsRegisteredCopy();
}

已实施:

public class Sign : ISign
    {
        TabibContext context = new TabibContext();
        public Task<bool> IsRegisteredCopy()
        {
            return context.Doctors.Any();
        }
    }

所以我需要从Any方法中返回一个当前不可用的任务!


return context.Doctors.AnyAsync(); - DavidG
不在 IntelliSense 中可用! - mshwf
你是否导入了 System.Data.Entity 命名空间? - DavidG
不,我以为它存在于“System.Data”中。 - mshwf
2个回答

8

Entity Framework拥有多种异步扩展方法,可在System.Data.Entity命名空间中使用。因此,您可以这样做:

using System.Data.Entity;

public Task<bool> IsRegisteredCopy()
{
    return context.Doctors.AnyAsync();
}

2
您有几种方法可以做到这一点。其中之一是Matthew Watson的方式(return Task.Run(() => context.Doctors.Any());)。这不被视为良好的实践方式(请参阅Stephen Cleary在此问题中的答案和链接)。
这是另一种无需实际运行任务即可返回任务的方法:
return Task.FromResult(context.Doctors.Any());

这样,您可以在不触发所有任务的情况下返回一个值。当您的方法中实际上没有任务时,这是一种更好的做法。

注意:在Entity Framework的最新版本中,您有一个AnyAsync方法,它甚至更好:

public async Task<bool> IsRegisteredCopy()
{
    return await context.Doctors.AnyAsync();
}

您需要使用以下方式添加:System.Data.Entity;


为什么你要使用return await,而不是简单地使用return呢? - Eric Lippert
虽然直接返回任务(编译器不会添加所有等待的内容)更有效率,但是Stephen Cleary有一篇很好的博客文章[article](http://blog.stephencleary.com/2016/12/eliding-async-await.html)讨论了这个问题。简短的回答是:对于复杂的代码,建议始终使用async/await。例如,当您使用“using”子句时,调用Dispose()可能会导致某些问题。异常捕获也会受到您调用await的时机的影响,等等。 - fharreau
1
@fharreau 万一你还没有意识到...Eric参与了C#的创建,所以他可能不需要你给他解释 :) - DavidG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接