Поделиться через


Правила и семантики путей к ресурсам (платформа служб данных ADO.NET)

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

Правила

Следующие правила применяются к любому сегменту пути к ресурсу:

  • Если набор сущностей не находится в используемом по умолчанию контейнере сущностей, то при создании адреса необходимо использовать следующий синтаксис: /ServiceName/<EntityContainer>/<EntitySet>. Если сегменты объединяются в путь, ведущий к набору сущностей в том же контейнере, где находится первый набор, указанный в пути, то перед набором не требуется указывать имя контейнера.

  • Порядок ключей в предикате составного ключа имеет значение. Клиенту необходимо располагать значения ключей в составном ключе в том же порядке, в каком они указаны в описании языка CSDL в службе данных. Дополнительные сведения см. в разделе Концептуальная схема (язык CSDL).

  • Не указываются сегменты пути после фразы: /$links/<segment>. Например, нельзя указать сегмент пути после 'BestFriend' в URI: http://host/service.svc/Person(1)/$links/BestFriend. Наличие какого-либо дополнительного сегмента пути приведет к появлению ответа «400 Неверный запрос».

  • Параметры запроса, начинающиеся с символа $, например $filter, не должны присутствовать в запросах к URI, адресующих ссылку с помощью $links. Наличие такого параметра запроса приведет к появлению ответа «400 Неверный запрос». Примечание. Допустимы не относящиеся к ADO.NET параметры запроса, которые не начинаются с символа $.

  • Во всех случаях использования следующего синтаксиса свойство привязки можно заменить свойством навигации.

  • Во всех случаях использования следующего синтаксиса первое вхождение набора сущностей в сегменте пути можно заменить операцией службы.

Семантики

Семантики для базового набора URI служб данных ADO.NET указаны в приведенном ниже списке типов синтаксиса URI. Можно объединять эти три базовых варианта для создания длинных URI. После каждого примера URI указывается эквивалентный синтаксис LINQ.

URI: имя_службы/<набор_сущностей>

В этом синтаксисе представлены все экземпляры типа сущности в указанном наборе сущностей. В наборе может содержаться 0, 1 или больше экземпляров типа сущности.

Пример

В этом примере возвращаются все клиенты в наборе сущностей Customers:

https://www.contoso.com/dataservice.svc/Customers

Эквивалентный синтаксис LINQ:

from c in Customers 
select c

URI: имя_службы/<набор_сущностей>(предикат_ключа)

В этом синтаксисе представлен экземпляр типа сущности, ключ которого равен предикату ключа и который находится в указанном наборе сущностей.

Пример

В этом примере возвращается клиент, определяемый ключом ALFKI:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')

Эквивалентный синтаксис LINQ:

(from c in Customers
where c.keyProperty == "ALFKI"
select c).First()

URI: имя_службы/<набор_сущностей>(предикат_ключа)/<сложный_тип>

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

Пример

В этом примере возвращается адрес клиента, определяемый ключом ALFKI в наборе сущностей Customers:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address

Эквивалентный синтаксис LINQ:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.ComplexType).First()

URI: имя_службы/<набор_сущностей>(предикат_ключа)/<сложный_тип>/<свойство>

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

К URI, который заканчивается свойством, можно добавить сегмент /$value. Сегмент $value действует как оператор разыменования и указывает, что необходимо вернуть только значение свойства без дополнительных метаданных или окружающего синтаксиса.

Пример

В этом примере возвращается адрес клиента, определяемый ключом ALFKI в наборе сущностей Customers:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address/Name

Этот пример аналогичен предыдущему, но он представляет значение свойства без каких-либо сопутствующих метаданных. Например, если URI задает изображение .jpg, то этот URI можно напрямую включить в качестве значения атрибута SRC в HTML-тег IMG:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address/Name/$value

Эквивалентный синтаксис LINQ:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.ComplexType.Property).First()

URI: имя_службы/<набор_сущностей>(предикат_ключа)<свойство>

В этом синтаксисе представлено свойство экземпляра типа сущности, ключ которого равен предикату ключа и который находится в указанном наборе сущностей.

К URI, который заканчивается свойством, можно добавить сегмент $value. Сегмент $value действует как оператор разыменования и указывает, что необходимо вернуть только значение свойства без дополнительных метаданных или окружающего синтаксиса.

Пример

В этом примере возвращается имя клиента, определяемое ключом ALFKI в наборе сущностей Customers:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/CustomerName

Этот пример аналогичен предыдущему, но он представляет значение свойства без каких-либо сопутствующих метаданных. Например, если URI задает изображение .jpg, то этот URI можно напрямую включить в качестве значения атрибута SRC в HTML-тег IMG:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/CustomerName/$value

Эквивалентный синтаксис LINQ:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.Property).First()

URI: имя_службы/<набор_сущностей>(предикат_ключа)/<свойство_навигации>

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

Пример

В этом примере возвращаются все элементы Orders для объекта Customer, определяемые ключом ALFKI:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Orders

Эквивалентный синтаксис LINQ:

from c in Customers
from c2 in c.RelatedEntitySet 
where c.keyProperty == "ALFKI"
select c2

Альтернативный синтаксис LINQ:

Db.Customers.Where(c => p.keyProperty.Equals("ALFKI")).SelectMany(c => c.RelatedEntitySet);

См. также

Понятия

Общие требования к HTTP (платформа служб данных ADO.NET)