如何在可查询的通用存储库中使用Async方法?

时间:2014-02-07 16:41:50

标签: c# task repository-pattern unit-of-work .net-4.5

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

[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;
    }

我并没有停留在执行此异步,并且似乎没有从.GetAsync()(如IReqpositoryQuery.cs中定义)IQueryable<TEntity>的直接方式,但很想知道一种实现这一目标的正确方法。

1 个答案:

答案 0 :(得分:1)

您需要使用Filter的{​​{1}}方法,而不是使用IRepositoryQuery

Where