繁体   English   中英

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

[英]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()的直接方法,但是很想知道一种正确的方法完成这个。

您需要使用IRepositoryQueryFilter方法,而不要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM