2014-02-07 4 views
0

В моем контроллере 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), но любопытно узнать о надлежащем способе выполнения этого.

+0

Вы не должны использовать 'Task.Factory.StartNew' (или' Task.Run') в ASP.NET. По другим вопросам они, вероятно, лучше всего задаются здесь (https://genericunitofworkandrepositories.codeplex.com/discussions). –

+0

@ StephenCleary - Спасибо. Есть ли у вас альтернативное предложение? – ElHaix

+1

Если у вас нет естественно-асинхронных методов (т. Е. Предоставленных библиотекой Generic Repository), вы должны просто использовать синхронные методы. На ASP.NET вы не должны использовать «поддельные асинхронные» методы, такие как разгрузка работы на другой поток. –

ответ

1

Вы должны использовать Filter метод 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(); 
} 
+0

+1 Я был в нескольких секундах от публикации этого – i3arnon

 Смежные вопросы

  • Нет связанных вопросов^_^