[英]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;
}
_context
的Books
将是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;
}
但是请注意,这没有任何意义,也不是使用Task
和async
/ await
的正确方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.