私は同等のものを達成する方法を理解しようとしています:
_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回の呼び出しで行うにはどうすればよいですか?
これを行う正しい方法は次のようなものです。
_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
_