Как использовать OData Expand как соединение SQL? - PullRequest
22 голосов
/ 13 октября 2010

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

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

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

... onконечная точка StackOverflow OData.Как будет создан этот 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 и сделать это за один вызов?

Ответы [ 2 ]

16 голосов
/ 13 октября 2010

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

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

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

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

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

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

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

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

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

.../Customers?$expand=Orders,OrderDetails
0 голосов
/ 13 октября 2010

Попробуйте метод .Intersect () .

...