2013-02-08 2 views
10

が、私はこのようになりますのODataクエリがあるとWCFデータサービス(ODataの)用の突起(選択)で展開します。は(私の実際のクエリは、はるかに複雑である)

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

これが正常に動作します。ただし、Addressオブジェクトにはサブオブジェクト(StateRef)があります。 StateRefはStateテーブルでルックアップを行うため、nullとして返されます。ここでは、説明するために

は、アドレスオブジェクトアドレスがどのように見えるかの例です:

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 ----------+ 

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

アップデート:ここで は私が求めています何を説明するためのクエリの例です:

このような

何か

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

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

私はその中の値を返す必要があります。

注:手動で「サブ」投影にすべて入力することができます。なぜ私はそれが欲しくないのかを上記で読んでください。

+0

のみ展開しているので、あなたのクエリを反転させることができる最初の子で動作するようですか?だからあなたのSOの例では、コメントで開始します。コメント。拡張(c => c.User)。拡張(c => c.Post).Take(10) – Phil

+0

@Phil、Alas、no。この例は単純ですが、実際のクエリは非常に複雑で、いくつかの「サブセクション」があります。 – Vaccano

+0

リンクが無効です。 –

答えて

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 }); 

拡大の正しい使用方法は、このようなものです:図書館の作家がで拡大使用禁止することを決定した理由を私は知らない

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

上記の概念証明が示すように、確かにそうすることが可能です。

ユーザー全体を受け取り、その後に投影しても構わない場合は、2番目の例を参照してください。そうでなければ、最初の例からURIを生成し、実行し、その後に射影を追加する独自のヘルパーを書くことができます。

+0

非常に興味深い....だから、サーバーはクライアントのライブラリではなく、それを許可します。私は私の質問に答えると思う。 – Vaccano

0

Expandはクエリで行われます。例えば、あなたはすべての46個の属性を一覧表示し、サブ突起部を作成する必要はありません

Orders 
    .Expand("StateRef") 
    .Select(z => new { ... }); 
+0

これは例外です:* NotSupportedException:明示的な拡張が同じクエリで指定されている間に投影を作成できません。* – Vaccano

+0

Ordersクエリのコード全体を表示してください。複数の展開では、.Expand引数にカンマを使用できます。 –

+0

しかし、expand句とselect句は使用できません。任意の照会および任意のエンドポイント。 Expandを使用したのは、それが私が探している機能だからです。しかし、私はExpandとSelectを組み合わせることはできませんでした。あなたができる場合は(NetflixまたはStackOverFlowsフィードに対して)例を投稿してください。 – Vaccano

2

:あなたが何かをしたいHow to: Load Related Entities (WCF Data Services)

を参照してください。

(from u in Users 
select new 
    { 
    u.Id, u.Reputation,Comments = (from c in u.Comments 
            select new YourClass {comment = c, 
                  post= c.Post}) 
    } 
) 
.Take(10) 


..... 


public Class YourClass 
    { 
    public Comment comment {get; set;} 
    public Post post {get;set;} 
    } 

私はあなたが後になっているとは限りません。

これは別に、正しいODataクエリを生成するLinQ式を記述しようとすると多くの時間を費やす可能性があります.Open、Filterを使用して独自のODataクエリクラスを作成すると、はるかに時間がかかります、プロパティの選択などLinQクエリを作成しようとするのではなく、直接ODataクエリを書くことになります。

+0

私はあなたがそれを行うことができたのか分からなかった。これは問題の半分を解決します。(私はまだAutoMapperを使用できない匿名のタイプがあります)。誰も完全な応答で応答しない場合、私はあなたのものを選択します。 – Vaccano

+0

匿名の代わりに具体的な型を作成することができます。例えばクラスMyProjection {int Id {...}、...};新しいMyProjection {Id = u.Id ...}を選択してください。 – Phil

+0

Philが言っているように、匿名型は置き換えることができます。上記のコードスニペットを拡張して、ネストされた匿名型をどのように置き換えることができるかを示しました。 –

0

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

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}); 
+0

これは基本的に別の予測をしていますが、私は匿名型になります。 – Vaccano

関連する問題