Правила и семантики путей к ресурсам (платформа служб данных 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);