Подтвердить что ты не робот

Как использовать OData Expand как объединение SQL?

Я пытаюсь понять, как выполнить эквивалент:

select *
from Users u
inner join Comments c on c.UserId = u.Id
where Id = 1569

(псевдонимы таблицы для лучшей читаемости sql)

... в конечной точке OData StackOverflow. Как будет построен этот URL-адрес? Я смотрю документацию для Expand на OData.org, и я подумал бы, что это будет выглядеть примерно так:

https://odata.sqlazurelabs.com/OData.svc/v0.1/rp1uiewita/StackOverflow/Users?$Expand=Comments&$filter=UserId eq 1569, но это неправильно.

В Linq это будет (я думаю), но Join не поддерживается:

Users.Where(u=>u.Id==1569).Join(Comments, u=>u.Id, c=>c.UserId, (a,b)=>a.Id==b.UserId)

Мне не нужно строго разбираться в Linq, я просто пытаюсь понять, как построить URL-адрес запроса. В принципе, как я могу перевести предикат SQL-соединения на url OData и сделать это за один вызов?

4b9b3361

Ответ 1

Правильный способ сделать это будет примерно таким:

http://odata.stackexchange.com/stackoverflow/atom/Users(1569)?$expand=Comments

Проблема заключается в том, что в источнике данных, по-видимому, нет пользователей (не знаю почему), поэтому приведенный выше запрос вернет 404. Но это правильный синтаксис.

Идея состоит в том, что если вам нужна информация только о одном пользователе, вы "ориентируетесь" на нее с помощью /Users(1569) (материал в parethesis является основным ключом набора объектов). Затем, если вы также хотите включить все комментарии, просто добавьте $expand=Comments. Если вам нужны только комментарии, а не информация о пользователе, вы можете сделать /Users(1569)/Comments.

Обратите внимание, что используемая вами служба не определяет свойства навигации, поэтому приведенное выше не будет работать, поскольку "соединения" на самом деле не поддерживаются. Но конечная точка stackexchange odata имеет определенные свойства навигации.

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

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

Вы можете расширить дальнейшие "слои" графика. Если объект, возвращаемый в раскрывающемся списке, также определяет дополнительные свойства навигации, вы можете указать список свойств навигации, разделенный запятыми.

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

.../Customers?$expand=Orders,OrderDetails