转换任务<dbset <t>&gt;到任务<ienumerable <t>&gt;

时间:2016-04-09 18:39:23

标签: c# entity-framework linq lambda

我试图弄清楚为什么第一个代码块出错而第二个块不是唯一的区别是第一个是使用Task而第二个块不是。看了各种来源,但无法得到明确的答案。 任何人都知道如何修复第一个块?

参考下面的链接但到目前为止没有运气 How to cast DbSet<T> to List<T>
Why DbSet<TEntity> doesn't implement 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;
    }

3 个答案:

答案 0 :(得分:1)

你基本上只需要这个:

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

Books的{​​{1}}将是_context。使用async / await,您基本上可以异步加载IEnumerable<Asset>。上述方法与以下方法的基本区别

Books

是当您要求迭代public IEnumerable<Asset> GetAlls() { var assets = _context.Books; return assets; } 的结果或者通过调用GetAlls方法基于此结果创建列表时,您将进行同步调用(阻塞调用,当前执行将冻结,直到您获得所请求的结果。在第一种情况下,您释放调用ToList的线程,当结果可用时,您的代码的执行将在另一个线程上继续或者在调用GetAllAsync()的线程中,只要数据在请求的时刻可用)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

要修复,只需让您的任务返回预期类型,即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的正确方式。