在我的EF存储库中给出以下代码:
IRepository
{
Task<IEnumerable<MyEntity>> GetEntities(Func<IQueryable<MyEntity>, IQueryable<);
}
EFRepository : IRepository
{
public async Task<IEnumerable<MyEntity>> GetEntities(Func<IQueryable<MyEntity>, IQueryable<MyEntity>> projection)
{
using (var context = new MyDbContext())
{
var query = context.MyEntities
.Include(e => e.RelatedEntity);
return await projection(query).ToListAsync();
}
}
}
在我使用repo的服务层中的类似内容(服务层在实际案例中有一些验证和过滤)
public async Task<IEnumerable<MyEntity>> GetEntities()
{
// _repo is constructor injected
// In this example, we just add a simple filter, but in the actual
// code the query is built based on several input parameters
return await _repo.GetEntities(query => query.Where(entity => entity.SomeProperty == "SomeValue"));
}
在等待服务层的任务后,我正在ObjectContextDisposed
内进行迭代,我得到IEnumerable<MyEntity>
。
我的印象是,对.ToListAsync()
的调用实际上会确保从数据库中提取集合并在返回时准备好使用,就像ToList
同步一样。
我还尝试在查询中添加.AsNoTracking()
,但我收到同样的错误。
我对.ToListAsync()
的假设是否不正确?