2012-03-25 6 views
4

私はWindows Phone 7のSilverlightクライアントからodataフィードを使用しようとしています。基本的には、GroupsとUsersの間のUserGroupテーブルを持つ多対多のデー​​タ関係です。ユーザーがログインすると、UserIdを使用して自分が所属するグループを照会する必要があります。私はすべてを試してみましたODataフィードからの多対多のクエリ

[DataServiceKey("Id")] 
public class Group 
{ 
    public Guid Id { get; set; } 
    public string GroupTag { get; set; } 
    public DateTime DateCreated { get; set; } 

    [ForeignKey("GroupOwner")] 
    public Guid? GroupOwnerId { get; set; } 
    public virtual Person GroupOwner { get; set; } 

    public bool IsActive { get; set; } 

    public virtual ICollection<GroupUser> GroupUsers { get; set; } 
} 

[DataServiceKey("Id")] 
public class GroupUser 
{ 
    public Guid Id { get; set; } 

    [ForeignKey("Group")] 
    public Guid GroupId { get; set; } 
    public virtual Group Group { get; set; } 

    [ForeignKey("Person")] 
    public Guid PersonId { get; set; } 
    public virtual Person Person { get; set; } 
    public bool IsActive { get; set; } 
} 
[DataServiceKey("Id")] 
public class User 
{ 
    public Guid Id { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public virtual ICollection<GroupUser> UserGroups { get; set; } 
    public virtual ICollection<Group> MyGroups { get; set; } 
} 

を次のように私のデータクラスは、私はこの結果を得るために知っているが、私は関係なく、私が何を次々エラーを取得していない保ちます。それはあまりにも厄介なので、私はしたくない2つのクエリを持っているのは短かった、そこには何か解決策はありますか?

------研究の長い夜から更新------

、私はODATAはそう、「どれでも」と「すべて」タイプのクエリをサポートしていないの制限があることを発見しました私の質問は現時点では不可能です。私はまた、hereから、私のpocoクラスの実装は、このナビゲーション問題を解決するのに役立つ中間クラスを明示的に定義することなく多対多の関係を表すようにわずかに変更できることを発見しました。 私はナビゲーションプロパティを定義する際に問題を抱えていますが、ソリューションが見つかるとすぐにここに置いて、この道を歩む他の不運な旅行者を助けることができます。

+0

あなたが探している結果は何ですか? – casperOne

+0

こんにちはCasperOne、私はUserIdを提供し、ユーザーが属しているグループのリストを取得するために探しています。 –

答えて

1

私の最終的なodataサービスの実装方法は次のとおりです。 まず、私は、データが正規化テーブルGroupUserを排除し、オブジェクト自体に関連するコレクションを定義改造しなければならなかった:DataContextのクラスにおいて

[DataServiceKey("Id")] 
public class Group 
{ 
    public Guid Id { get; set; } 
    public string GroupTag { get; set; } 
    public DateTime DateCreated { get; set; } 

    [ForeignKey("GroupOwner")] 
    public Guid? GroupOwnerId { get; set; } 
    public virtual Person GroupOwner { get; set; } 

    public bool IsActive { get; set; } 

    //his represents the many-to-many relationship 
    public virtual ICollection<User> GroupMembers { get; set; } 
} 


[DataServiceKey("Id")] 
public class User 
{ 
    public Guid Id { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

    //This represents the many-to-many relationship 
    public virtual ICollection<Group> MembersOfGroups { get; set; } 

    //This represents the 'GroupOwner' ForeignKey relationship 
    public virtual ICollection<Group> MyGroups { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().HasMany(p => p.MemberOfGroups). 
      WithMany(c => c.GroupMembers) 
      .Map(t=>t.MapLeftKey("GroupId") 
       .MapRightKey("UserId") 
       .ToTable("GroupUsers")); 

    } 

を次のように、私はその後OnModelCreatingメソッドをオーバーライドこれは、基本的にエンティティフレームワークに、私のモデルをどのようにして定義したいかについての洞察を与え、従来の実装をオーバーライドします。

Userエンティティは、多くの(多数の)MemberOfGroupsを持つことができ、それぞれが「多数の」GroupMembersと共に存在することができます(したがって、多対多関係)、左側のテーブル(Group)の外部キーフィールドはGroupIdとし、右側のテーブル(User)はUserIdと呼び、これらを "GroupUsers"というテーブルにマップする必要があります。

エンティティフレームワークによって生成されたデータテーブルを見ると、UserIdとGroupIdが結合された主キーとして、それぞれが対応するエンティティテーブルとの外部キー関係を参照する2つの列を持つGroupUsersという3つ目のテーブルが見つかります。

これにより、両方のコレクションが対応する親エンティティの1対多の関係であるかのように、odataサービスを簡単に照会できます。私はこれが誰かを助けることを望む。

1

any/allの問題を回避するには、Webgetを使用してサーバー側でany/allフィルタリング機能を実行します。戻り値を照会可能として設定すると、照会呼び出しでカスタムのフィルター機能と一緒に標準のodata規則を使用することができます。

つまり、ウェブを作成した後のクエリ呼び出しは、このように動作します。

http://myServer:8000/MyService.svc/MyCustomFilteringWebGet?FilteringData=User/groups&$inlinecount=allpages 

[WebGet] 
public IQueryable<User> MyCustomFilteringWebGet(string FilteringData = null) 
{ 
    return //Return any/all filtered data here. 
} 
+0

これはうまく見える、私はそれを試して、結果を得る。ありがとう! –

+0

確かです。それが役に立てば幸い。 – George

2

最近、すべてのサポートがODataプロトコルに追加されました。

Support for Any and All

Even More Any and All

のOData、WCF Data Servicesの、の.NET実装もAny/All supportがあります。ここでのOData内の任意の/すべてのいくつかの情報を持つ2件のブログの記事です。もちろん、これを利用するには、対話しているサーバーがAny/Allをサポートしている必要があります。

+0

Odata.orgのブログのリンクがダウンしています。もっと情報を投稿できますか? –

関連する問題