2015-02-03 5 views
1

У меня есть проект Asp.net Web Api, который имеет методы CRUD.Запрос базы данных API веб-API Asp.net

Однако у меня есть метод, называемый List, который извлекает список элементов, найденных в базе данных.

Мне нужно предоставить гибкость для применения пользователем custom sorts или custom queries поверх сущностей.

Лучшее решение, которое я нашел до сих пор, использует OData.

Однако OData намного сложнее, чем это, и я думаю, что он создает дополнительную сложность, не нужно (Create/Update/Delete работает отлично, как сейчас).

Мой вопрос:

  1. ли что-то подобное OData что я могу реализовать в моем Asp.net Web Api проект, который позволяет мне запрашивать данные из базы данных?

  2. Если нет, могу ли я реализовать OData только для одного метода в моем контроллере (List)?

+0

Почему бы вам просто не пройти в критерии запроса объекта? – rism

+0

Я не знаю, знает ли сервер, как интерпретировать строку запроса по критерию запроса по умолчанию. Мне нужен какой-то тип конфигурации/сопоставления – Catalin

+0

Форматировщики медиа-типа http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api – rism

ответ

2

OData - хороший вариант на платформе .NET. Конечно, есть альтернативы, но OData должен быть достаточно хорош для вашего прецедента. Если вам не нужны все функции OData, вы также можете реализовать запрос самостоятельно, следуя аналогичным принципам, а все OData - это протокол, а у Microsoft есть своя реализация в .NET.

Да вы можете включить запрос OData глобально или для одного действия в контроллере Web API.

Вот выдержка с сайта ASP.NET:

Метод EnableQuerySupport позволяет параметры запроса глобально для любого действия контроллера, который возвращает IQueryable типа. Если вы не хотите, чтобы параметры запроса были включены для всего приложения, вы можете включить их для определенных действий контроллера, добавив атрибут [Queryable] к методу действий.

Вот пример контроллера Web API с запрашивая включен:

public class ProductsController : ApiController 
{ 
    [EnableQuery] 
    IQueryable<Product> Get() {} 
} 

Вы можете вызвать клиента управляемый подкачки на контроллер выше по следующему адресу:

http://localhost/Products?$top=10&$skip=20 

Более подробная информация здесь : http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

В приведенном выше примере я использовал атрибут EnableQuery вместо Queryable, поскольку последний является устаревшим.

Вы можете установить OData используя следующий NuGet пакет:

https://www.nuget.org/packages/Microsoft.AspNet.OData/

+0

Точно что я искал. Остается только одна проблема (две на самом деле): Как я могу настроить имена свойств объекта? Например, игнорируйте свойство DateCreated, потому что 'DateTime' не поддерживается' OData' и преобразовывает 'Name' в' application-name' например? – Catalin

+0

Я не думаю, что тире поддерживается протоколом OData, поэтому вы не сможете использовать «имя приложения». DateCreated может быть преобразован в DateTimeOffset, чтобы заставить его работать. Тем не менее, я бы предложил использовать другой класс, который был создан только для целей запроса OData, поэтому вы раскрываете только то, что необходимо OData в форме, которую можно использовать. –

+0

Хорошо, я согласен. Я искал пример того, как построить другой класс, используемый только для OData, но без успеха. Из того, что я пробовал, класс всегда должен быть тем же классом, который используется Entity Framework. У вас есть пример того, как создать другой класс только для OData? – Catalin

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