[英]How to use Async methods of in a queryable generic repository?
在我的OData控制器中,我正在使用此处找到的通用存储库,并且可以执行以下操作:
[Queryable]
public Task<IQueryable<ContentType>> Get()
{
var result = _repository.Query().GetAsync();
return result;
}
我想向查询添加一些条件,例如UserId
并使用UnitOfWork
模式,
我正在尝试以下方法:
[Queryable]
public Task<IQueryable<ContentType>> Get()
{
// mock
var userId = 111;
var unitOfWork = new Repository.UnitOfWork(_db);
var result = unitOfWork.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId).Cast<ContentType>() // <-- how to access .GetAsync()
return result;
}
我已经尝试了以下方法(可行),但想知道这是否是实现此目的的最佳方法?
[Queryable]
public async Task<IQueryable<ContentType>> Get()
{
// mock
var userId = 102;
var unitOfWork = new Repository.UnitOfWork(_db);
var result = unitOfWork.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId).Cast<ContentType>().AsQueryable();
return await Task.Factory.StartNew(() => result);
}
-更新-
基于讨论,我删除了其中的异步部分并执行以下操作:
public IEnumerable<ContentType> Get(ODataQueryOptions<ContentType> options)
{
var unitOfWork = new Repository.UnitOfWork(_db);
// mock
var userId = 102;
var contentTypes = options.ApplyTo(unitOfWork.Repository<ContentType>().Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(c => c.Description))
.Cast<ContentType>().ToList();
return contentTypes;
}
我并没有坚持做异步操作,而且似乎没有从IQueryable<TEntity>
(如IReqpositoryQuery.cs中定义.GetAsync()
到.GetAsync()
的直接方法,但是很想知道一种正确的方法完成这个。
您需要使用IRepositoryQuery
的Filter
方法,而不要使用Where
:
[Queryable]
public Task<IQueryable<ContentType>> Get()
{
// mock
var userId = 111;
var unitOfWork = new Repository.UnitOfWork(_db);
return unitOfWork.Repository<ContentType>().Query()
.Filter(u => u.UserId == userId)
.GetAsync();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.