2012-03-29 13 views
1

Für einen gegebenen Entitätssatz, sagen wir, WHO_TYPES, möchte ich die Spalten auf die ID und die WHO_TYPE_NAME beschränken.Wie filtern Ausgabespalten mit WCF OData Services?

Das Unternehmen setzte sich ausgesetzt ist, über:

config.SetEntitySetAccessRule("WHO_TYPES", EntitySetRights.AllRead); 

... so kann ich nicht sehen, wie dies zu tun ist, wenn die Einheit/Tabellenzugriffsregeln festlegen. Ist es möglich, einen QueryInterceptor zu schreiben, um dies zu erreichen? Wenn das so ist, wie?

Ein weiterer Versuch, den ich gemacht habe, ist eine benutzerdefinierte Methode zu schreiben, die ein benutzerdefiniertes Objekt verweist:

[DataServiceKey("MY_WHO_TYPES")] 
public partial class MY_WHO_TYPES 
{ 
    public MY_WHO_TYPES() { } 

    public int MY_WID { get; set; } 
    public string MY_WNAME { get; set; } 
} 

Meine eigene Methode:

[WebGet] 
    public IQueryable<MY_WHO_TYPES> GetWhoTypesCustom() 
    { 
     var whoCustom = from w in this.CurrentDataSource.WHO_TYPES 
         select new MY_WHO_TYPES() { MY_WID = w.ID, MY_WNAME = w.WHO_TYPE_NAME }; 

     return whoCustom.AsQueryable<MY_WHO_TYPES>(); 
    } 

Mit diesem Versuch, erhalte ich die folgende Fehlermeldung:

Ich fühle eine Art Repository-Muster kommen in einer Antwort, bu t Ich hoffe, das könnte einfacher sein.

Die suggestion ein Tuple der Verwendung klingt gut, aber ich bin mir nicht ganz sicher, wie es zu implementieren, oder was der Rückgabetyp wäre:

select new { Tuple<int, string> (w.ID, w.WHO_TYPE_NAME)}; // error: Invalid anonymous type member declarator. Anonymous type members must be declared with a memeber assignment... 

Als nächstes versuchte ich einfach einen anonymen Typ Rückkehr:

[WebGet] 
    public IQueryable GetWhoTypesCustom() 
    { 
     var whoCustom = from w in this.CurrentDataSource.WHO_TYPES 
         select new { w.ID, w.WHO_TYPE_NAME }; 
     return whoCustom; 
    } 

Das Problem damit ist, dass ich einen Fehler bekomme, der angibt, dass der IQueryable-Typ nicht definiert ist.

Antwort

1

Der einfachste Weg, dies zu tun ist, gespeicherte Prozeduren anstelle der eigentlichen Entitäten selbst zu verwenden.

Dies beinhaltet die Erstellung eines komplexen Typs aus dem Sproc. Definieren Sie die Spalten, die im Sproc zurückgegeben werden sollen, und erstellen Sie beim Erstellen Ihrer Entitäten ein komplexes Objekt.

Vom * .edmx Ansicht:

Right-click/Add/Function Import 
Select the sproc 
Give it a Function Import Name 
Click Get Column Information 
Click Create New Complex Type - give it a name (by default looks like [Function Import Name]_Result 

Das sollte Arbeit, aber es scheint, dass es einige Problem ist, wenn die Serviceaufwendig, wo in einem Browser die URL der Navigation zeigt Daten, aber beim Verzehr In einer Anwendung wird ein Fehler im Service-Trace-Protokoll angezeigt: Configuration evaluation context not found. Dies wird in einer anderen Frage angesprochen.

Wenn es jedoch eine 1 ist: 1 Feldzuordnung in der sproc einen der Entitäten in den obigen Schritten, anstatt eine neue komplexe Art der Auswahl wählt Entities und die zusammenpassende Entität und dies wird gut funktionieren in in beiden Fällen (URL-Navigation und Verbrauch).

class Program 
{ 
    static void Main(string[] args) 
    { 
     DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/DataService1.svc/")); 
     IEnumerable<WHO_TYPES> result = context.Execute<WHO_TYPES>(new Uri("http://localhost:50100/DataService1.svc/GetDataWhoTypesSproc")); 
     foreach (WHO_TYPES w in result) 
     { 
      Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME + "\t" + w.CREATED_DATE); 
     } 

     Console.Read(); 
    } 
} 

Das Problem gefunden (nicht in der Lage komplexe Typen zurück) scheint die Ursache für this Problem zu sein, was und genauer here gerichtet.

Verwandte Themen