В моем контроллере OData, я использую общий репозиторий найден here и могу сделать следующее:Как использовать методы Async в запрашиваемом универсальном репозитории?
[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()
от IQueryable<TEntity>
(как определено в IReqpositoryQuery.cs), но любопытно узнать о надлежащем способе выполнения этого.
Вы не должны использовать 'Task.Factory.StartNew' (или' Task.Run') в ASP.NET. По другим вопросам они, вероятно, лучше всего задаются здесь (https://genericunitofworkandrepositories.codeplex.com/discussions). –
@ StephenCleary - Спасибо. Есть ли у вас альтернативное предложение? – ElHaix
Если у вас нет естественно-асинхронных методов (т. Е. Предоставленных библиотекой Generic Repository), вы должны просто использовать синхронные методы. На ASP.NET вы не должны использовать «поддельные асинхронные» методы, такие как разгрузка работы на другой поток. –