web-dev-qa-db-ja.com

SQL結合のようにOData Expandを使用するにはどうすればよいですか?

私は同等のものを達成する方法を理解しようとしています:

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

(SQLの読みやすさを向上させるためのテーブルエイリアス)

... StackOverflow ODataエンドポイント上。このURLはどのように構築されますか? OData.orgで Expand のドキュメントを見ていて、次のようなものだと思っていました。

_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結合述語をOData URLに変換し、これを1回の呼び出しで行うにはどうすればよいですか?

26
Factor Mystic

これを行う正しい方法は次のようなものです。

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

問題は、データソースにユーザーがいないように見える(理由がわからない)ため、上記のクエリは404を返します。しかし、これは正しい構文です。

アイデアは、1人のユーザーに関する情報だけが必要な場合は、/Users(1569)を使用してそのユーザーに「ナビゲート」することです(パレテシスの要素はエンティティセットの主キーです)。次に、すべてのコメントも含めたい場合は、単に_$expand=Comments_を追加します。ユーザーに関する情報ではなくコメントのみが必要な場合は、/Users(1569)/Commentsを使用できます。

使用したサービスはナビゲーションプロパティを定義しないため、上記は「結合」が実際にはサポートされていないため機能しません。しかし、stackexchange odataエンドポイントには、ナビゲーションプロパティが定義されています。

基本的に、結合はサーバー/サービスで定義されるため、クライアントはどの列がどの主キーの外部キーであるかを知る必要がありません。

また、リレーショナルデータベースをストレージとして使用しないデータソースの場合にも役立ちます。これは、偽の外部キーを作成する必要がないためです。

グラフの「レイヤー」をさらに広げることができます。展開で返されたエンティティがさらにナビゲーションプロパティを定義している場合は、ナビゲーションプロパティのカンマ区切りリストを指定できます。

メイクアップサービスの例を次に示します。これは、コレクション内の各顧客を拡張することに注意してください。これは、複数の結合に似ています。

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