繁体   English   中英

转换任务 <DbSet<T> &gt;到任务 <IEnumerable<T> &gt;

[英]Converting Task<DbSet<T>> to Task<IEnumerable<T>>

我试图弄清楚为什么第一个代码块会出错,而第二个代码块是错误的,唯一的区别是第一个代码块正在使用Task而第二个代码块却没有。 调查了各种来源,但无法获得明确的答案。 有人知道如何修复第一个块吗?

参考下面的链接,但到目前为止还没有运气如何将DbSet <T>强制转换为List <T>
为什么DbSet <TEntity>不实现EnumerableAsync

    public Task<IEnumerable<Asset>> GetAll()
    {
        var assets = Task.Factory.StartNew(() => _context.Books);
        return assets;
       // tried  toList<asset>() on "return assets" as well but didnt make any difference.
    }


    public IEnumerable<Asset> GetAlls()
    {
        var assets = _context.Books;
        return assets;
    }

您基本上只需要这样:

public async Task<IEnumerable<Asset>> GetAllAsync()
{
    return await _context.Books;
}

_contextBooks将是IEnumerable<Asset> 使用异步/等待你基本上实现加载Books异步。 上面的方法和下面的方法之间的基本区别

public IEnumerable<Asset> GetAlls()
{
    var assets = _context.Books;
    return assets;
}

是当您请求遍历GetAlls的结果或通过调用ToList方法基于该结果创建列表时,您将进行同步调用(阻塞调用,当前执行将被冻结,直到获得结果为止在第一种情况下,您释放在其中调用GetAllAsync()的线程,并且当结果可用时,您的代码将在另一个线程上或在调用GetAllAsync()的线程中继续执行,只要数据在请求的那一刻可用)

我知道这是旧线程。 在2018年,此代码对我有所帮助(可能对其他人有帮助):

public async Task<IEnumerable<Asset>> GetAll()
{
    var assets = _context.Books.AsEnumerable();
    return assets;
}

要解决此问题,只需使Task返回期望的类型,即IEnumerable<Asset>

public Task<IEnumerable<Asset>> GetAll()
{
    var assets = Task.Factory.StartNew(() => (IEnumerable<Asset>) _context.Books);
    return assets;
}


public IEnumerable<Asset> GetAlls()
{
    var assets = _context.Books;
    return assets;
}

但是请注意,这没有任何意义,也不是使用Taskasync / await的正确方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM