C# 如何在可查询的通用存储库中使用的异步方法?
在我的OData控制器中,我使用找到的通用存储库,可以执行以下操作:C# 如何在可查询的通用存储库中使用的异步方法?,c#,task,repository-pattern,unit-of-work,.net-4.5,C#,Task,Repository Pattern,Unit Of Work,.net 4.5,在我的OData控制器中,我使用找到的通用存储库,可以执行以下操作: [Queryable] public Task<IQueryable<ContentType>> Get() { var result = _repository.Query().GetAsync(); return result; } [Queryable] public Task<IQueryable<ContentType>> Get() { /
[Queryable]
public Task<IQueryable<ContentType>> Get()
{
var result = _repository.Query().GetAsync();
return result;
}
[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;
}
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;
}
我尝试了以下方法(哪种有效),但不知道这是否是实现这一点的最佳方法
[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);
}
[可查询]
公共异步任务Get()
{
//嘲弄
var userId=102;
var unitOfWork=new Repository.unitOfWork(_db);
var result=unitOfWork.Repository().Query().Get()
.Where(u=>u.UserId==UserId).Cast().AsQueryable();
返回wait Task.Factory.StartNew(()=>result);
}
--更新--
根据讨论,我删除了其中的异步部分,并执行了以下操作:
[Queryable]
public Task<IQueryable<ContentType>> Get()
{
var result = _repository.Query().GetAsync();
return result;
}
[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;
}
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;
}
public IEnumerable Get(ODataQueryOptions选项)
{
var unitOfWork=new Repository.unitOfWork(_db);
//嘲弄
var userId=102;
var contentTypes=options.ApplyTo(unitOfWork.Repository().Query().Get())
.Where(u=>u.UserId==UserId)
.OrderBy(c=>c.Description))
.Cast().ToList();
返回内容类型;
}
我并没有坚持这样做,而且似乎没有直接的方法从
IQueryable
(如IREqPositionQuery.cs中定义的)访问.GetAsync()
,但是很想知道实现这一点的正确方法。您需要使用IRepositoryQuery的过滤器方法,而不是使用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();
}
[可查询]
公共任务Get()
{
//嘲弄
var userId=111;
var unitOfWork=new Repository.unitOfWork(_db);
返回unitOfWork.Repository().Query()
.Filter(u=>u.UserId==UserId)
.GetAsync();
}
您不应在ASP.NET中使用Task.Factory.StartNew
(或Task.Run
)。对于你的其他问题,最好问一下。@StephenCleary-谢谢。您对此有其他建议吗?如果您没有自然异步方法(即,由通用存储库库提供),那么您应该只使用同步方法。在ASP.NET上,您不应该使用“假异步”技术,例如将工作转移到另一个线程。@StephenCleary当然,在这种特定情况下,有一些方法可以使用适当的异步来做他想做的事情,查看他正在使用的API,因此他不需要同步完成工作。@Servy-对,我不需要异步完成工作——这不是一项要求,只是希望遵循OData控制器模板所设定的模式。