10

次のようなODataクエリがあるとします(実際のクエリははるかに複雑です)。

Orders.Select(z => new { z.SubOrder.Addresses,
                         z.SubOrder.Cost,
                         z.SubOrder.SubOrderId, 
                         z.Sequence});

これは正常に機能します。Addressオブジェクトにサブオブジェクト(StateRef)があることを除いて。StateRefはStateテーブルを検索するため、nullとして返されます。

説明のために、アドレスオブジェクトAddressがどのように見えるかの例を次に示します。

Address:
    string         Street 1
    string         Street 2
    StateRef       PrimaryState
    string         City
    // ... 42 other string attributes not shown ...

オブジェクトには州のStateRef名前がありますが、他のいくつかの重要な州のプロパティもあります(おそらく州の鳥ですか?)

だから、私が疑問に思っているのは、PrimaryStateアイテムにアクセスできるようにするために、46個の属性すべてを含むz.SubOrder.Addressesの「サブプロジェクション」を作成する必要があるのでしょうか。(私は望んでいません

コーディングがはるかに多いだけでなく、匿名型を使用する必要があることも意味します。そのため、(AutoMapperを使用する代わりに)手動でマッピングする必要があります。

では、私が探しているのは、プロジェクション内でStateRefを「拡張」する方法ですか?

このようなもの:

Orders.Select(z => new { z.SubOrder.Addresses.Expand("PrimaryState"),
                         z.SubOrder.Cost,        ^
                         z.SubOrder.SubOrderId,  |
                         z.Sequence});           |
                                                 |
// This is not allowed by the compiler ----------+

これを試してみると、次のエラーが発生します。

匿名タイプのメンバー宣言子が無効です。匿名型のメンバーは、メンバーの割り当て、単純な名前、またはメンバーアクセスを使用して宣言する必要があります。

更新: これは私が質問していることを説明するためのクエリの例です:

Users.Take(10).Select(x=>new { x.Id, x.Reputation, x.Comments})

「 data.stackexchange.com/stackoverflow/atom 」に対してそれを実行します。Commentsにはnullを返すPostオブジェクトがあることがわかります。

その中の値を返すためにそれが必要です。

注:すべてを手動で「サブ」プロジェクションに入力できることはわかっています。私がそれを望まない理由については、上記をお読みください。

4

5 に答える 5

7

それは確かに可能です。概念実証のために、これを実行してみてください。

var uri = new Uri( "http://data.stackexchange.com/stackoverflow/atom/Users()?$top=10&$expand=Comments/Post&$select=Id,Reputation,Comments/" );
entities.Execute<User>( uri, "GET", false ).Select( x => new { x.Id, x.Reputation, x.Comments } );

expand の正しい使い方は次のようになります。

entities.Users.Expand( "Comments/Post" ).Take( 10 ).ToArray();

ライブラリの作成者が、Expand with Projects の使用を許可しないことにした理由はわかりませんが、上記の概念実証が示すように、そうすることが確かに可能です。

ユーザー全体を受け取り、その後プロジェクションを行うことを気にしない場合は、2 番目の例を使用できます。それ以外の場合は、最初の例から URI を生成し、それらを実行して、その後にプロジェクションを追加する独自のヘルパーを作成できます。

于 2013-02-15T11:43:16.037 に答える
2

できるよ、

Users.Take(10).Select(x=>new { Id = x.Id, Reputation = x.Reputation, Comments = x.Comments.Select(c =>c.Id) })

その結果、リクエストが発生します。

https://data.stackexchange.com/stackoverflow/atom/Users()?$top=10&$expand=Comments&$select=Id,Reputation,Comments/Id

于 2013-02-15T18:27:38.753 に答える
1

サブオブジェクトから特定のプロパティを選択できます。

たとえば、StackOverflow の例では、次のクエリを LINQPad で正常に実行できます。

Users
.Take (10)
.Select(x => new {x.Id, x.Reputation, CommentsText = x.Comments.Select(c => c.Text)})

あなたの場合、次のようなクエリを書くことができます:

Orders.Select(z => new { StateName = z.SubOrder.Addresses.Select(a => a.PrimaryState),
                     z.SubOrder.Cost,        
                     z.SubOrder.SubOrderId,
                     z.Sequence});   
于 2013-02-11T19:15:27.977 に答える
0

これExpandはクエリで行われます。「方法: 関連エンティティを読み込む (WCF Data Services)」を参照してください。

次のようなものが必要です。

Orders
  .Expand("StateRef")
  .Select(z => new { ... } );
于 2013-02-08T22:39:47.177 に答える