2015-06-19 3 views
2

Я новичок в OData, и у меня есть вопрос об использовании его в моем веб-интерфейсе .NET. В моем веб-API, если у меня есть контроллер со следующим методом Get:OData & .NET Web API

[EnableQuery()] 
public IQueryable<Product> Get() 
{ 
    var productRepository = new ProductRepository(); 

    return productRepository.Retrieve().AsQueryable(); 
} 

это нужно для меня, чтобы извлечь все продукты, прежде чем применяются параметры запроса OData или есть способ для меня только извлекаемых продуктов с использованием параметры запроса OData?

Я бы не захотел получить все продукты, которые могут быть более 100 000, а затем параметры запроса OData применяются только для возврата, как 10 записей, основанных на моих критериях.

Спасибо за любую помощь по этому вопросу.

ответ

0

Поскольку вы возвращаете коллекцию как IQueryable, вы фактически не получили все данные, фильтры будут применены к ней для вас. Here is a nice explanation of how IQueryable works with entity framework. OData Web API просто преобразует URL-адреса OData в операторы LINQ, которые выполняются на уровне базы данных.

0

Злоумышленник или наивный клиент может построить запрос, который занимает очень много времени. В худшем случае это может привести к нарушению доступа к вашему сервису .

Атрибут [Queryable] - это фильтр действий, который анализирует, проверяет, и применяет запрос. Фильтр преобразует параметры запроса в выражение LINQ . Когда контроллер OData возвращает тип IQueryable, поставщик IQueryable LINQ преобразует выражение LINQ в запрос . Следовательно, производительность зависит от поставщика LINQ, который используется , а также от конкретных характеристик вашего набора данных или схемы базы данных .

Если вы знаете, что всем клиентам доверяют (например, в корпоративной среде ), или если ваш набор данных невелик, производительность запроса может не быть проблемой. В противном случае, you should consider the following recommendations.

Я ваш случай, если вы были бы заинтересованы в:

// Enable server-driven paging. 
[Queryable(PageSize=10)] 
Смежные вопросы