C# 如何在可查询的通用存储库中使用的异步方法?

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() { /

在我的OData控制器中,我使用找到的通用存储库,可以执行以下操作:

[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控制器模板所设定的模式。