2012-03-25 4 views
4

Ich versuche, einen ODATA-Feed von einem Windows Phone 7 Silverlight-Client zu konsumieren. Grundsätzlich ist eine Viele-zu-viele-Datenbeziehung zwischen Gruppen und Benutzern mit einer UserGroup-Tabelle zwischen ihnen. Wenn sich ein Benutzer anmeldet, muss ich mithilfe seiner UserId nach den Gruppen fragen, zu denen er gehört. Meine Daten-Klassen sind wie folgtViele zu viele Abfrage von OData-Feed

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

ich alles versucht habe, ich weiß, um dieses Ergebnis zu erhalten, aber ich erhalte einen Fehler nach dem anderen, egal, was ich tue. Abgesehen von zwei Abfragen, die ich nicht machen möchte, weil es zu unordentlich wäre, gibt es eine Lösung?

------ ------ aktualisieren

Aus der langen Nacht der Forschung habe ich entdeckt, dass OData die Begrenzung der nicht unterstützt hat ‚jeder‘ und "Alle Anfragen der Art, so meine Abfrage wäre zu diesem Zeitpunkt nicht möglich. Was ich auch aus here herausfand, dass meine Implementierung der Poco-Klassen leicht modifiziert werden könnte, um eine Viele-zu-Viele-Beziehung darzustellen, ohne die Klasse in der Mitte explizit zu definieren, was mir möglicherweise helfen würde, dieses Navigationsproblem zu lösen. Ich bin noch dabei, es auszuarbeiten, da ich Probleme habe, die Navigationseigenschaften zu definieren, aber sobald ich eine Lösung habe, werde ich es hier aufstellen, damit es einem anderen glücklosen Reisenden helfen kann, der diesen Weg geht.

+0

Was sind die Ergebnisse, die Sie suchen? – casperOne

+0

Hallo CasperOne, ich suche nach einer UserId und erhalte eine Liste von Gruppen, zu denen der Benutzer gehört. –

Antwort

1

Also hier ist, wie ich schließlich für meine Odata-Service implementiert. Zuerst hatte ich die Daten Eliminieren der Normalisierungstabelle Gruppenbenutzer und die Definition der zugehörigen Sammlung auf die Objekte neu zu gestalten sich:

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

In der Datacontext-Klasse habe ich dann die OnModelCreating Methode überschreiben, wie

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

    } 

folgt Dies gibt dem Entity-Framework im Grunde einen Einblick in die Art und Weise, wie ich mein Modell definieren möchte, wodurch die herkömmliche Implementierung überschrieben wird. Der einfachste Weg meiner Meinung nach, um die obige Aussage zu verstehen, ist, es als eine Aussage wie folgt zu lesen:

Die Benutzereinheit kann viele (hat viele) MemberOfGroups haben, von denen jede 'mit vielen' GroupMembers existieren kann (daher die (viele zu viele Beziehungen), das Fremdschlüsselfeld für die linke Tabelle (Group) sollte GroupId heißen und für die rechte Tabelle (User) sollte UserId genannt werden und diese sollten einer Tabelle namens "GroupUsers" zugeordnet werden.

Wenn Sie sich die von Entity Framework generierten Datentabellen ansehen, finden Sie eine dritte Tabelle namens GroupUsers mit zwei Spalten: UserId und GroupId als kombinierter Primärschlüssel, die jeweils auf eine Fremdschlüsselbeziehung mit der entsprechenden Entitätstabelle verweisen.

Mit diesem können Sie leicht Ihren odata-Dienst abfragen, als ob beide Sammlungen eins zu viele Beziehungen der entsprechenden übergeordneten Entität waren. Ich hoffe, das hilft jemandem.

1

Eine Problemumgehung für das Problem Any/All besteht darin, ein Webget zu verwenden, um die Filterfunktion all/all auf der Serverseite auszuführen. Wenn der Rückgabewert als Abfrage definiert ist, können Sie die Standard-ODATA-Konventionen zusammen mit Ihrer benutzerdefinierten Filterfunktion im Abfrageaufruf verwenden.

d. H. Der Query-Aufruf nach dem Erstellen Ihres Web-Get würde so funktionieren.

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

Das sieht gut aus, ich probiere es aus und komme mit Ergebnissen zurück. Vielen Dank! –

+0

Sicher Sache. Ich hoffe es hilft. – George

2

Any/All-Unterstützung wurde kürzlich dem OData-Protokoll hinzugefügt. Hier sind zwei Blog-Posts mit einigen Informationen über Any/Alle in OData:

Support for Any and All

Even More Any and All

Die .NET-Implementierung von OData, der WCF Data Services, auch Any/All support hat. Um dies zu nutzen, muss der Server, mit dem Sie interagieren, Any/All unterstützen.

+0

Der Odata.org Blog-Link ist nicht verfügbar. Kannst du mehr Infos posten? –