Die Anwendung deutlich zu OData query
Möchte ich, um eine Liste von unterschiedlichen Werten aus meiner OData-Endpunkt. Aber distinct-oder group by wird jedoch nicht unterstützt.
Mein URI-query sieht wie folgt
GET /odata/Products?$select=foo & $top=10 & $count=true & distinct=true
Mein Controller
[EnableQuery]
public IQueryable<FooBarBaz> Get(ODataQueryOptions<FooBarBaz> queryOptions, bool distinct)
{
//I've tried the following
return Repository.AsQueryable().Distinct();
//and
return Repository.AsQueryable().GroupBy(x => x.Foo);
//and
IQueryable query = queryOptions.ApplyTo(Repository.AsQueryable());
return query.Distinct(); //Can't call .Distinct() here
}
Keine funktioniert 🙁
Die Komponente AdaptiveLINQ kann Ihnen helfen. Disclaimer: ich bin der AdaptiveLINQ Entwickler.
Ich werde mal schauen 🙂
Ich werde mal schauen 🙂
InformationsquelleAutor Snæbjørn | 2015-05-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die beste Lösung, um das problem zu lösen, definieren Sie eine Sammlung Aktion auf die Ressource.
Ersten Schritt : konfigurieren Sie das 'Distinct' - Aktion in der WebApiConfig.cs
Zweite Schritt : Fügen Sie die Aktion in FooBarBazsController.cs liefert die Sammlung von verschiedenen Entitäten
Dritter Schritt : Fügen Sie eine statische Methode liefert einen Ausdruck für die groupby-auf der Grundlage der Eigenschaft Name.
Nun Erstellen Sie das Projekt, und Sie können die Abfrage der Ressource wie dieses
Und können auch die $select und $aufwenden, wie dies
Ich hoffe, dass dies das problem lösen. +1, wenn es tun.
[Queryable]
sollte[EnableQuery]
obwohl.Ich habe aktualisiert, der code-block, wie Sie vorgeschlagen.
InformationsquelleAutor Ravi Kumar Mistry
Da Sie angegeben haben das EnableQuery-Attribut, können Sie die $gelten groupby Ihr verschiedene Felder, die zimmerreserviereung, ohne das hinzufügen von benutzerdefinierten Funktionen oder Parameter auf, erhalten Sie diese kostenlos aus der box:
Dies ist einfacher OData-v4-standard-syntax, benötigt keine code-änderungen zu implementieren. Gehen Sie nicht ändern jeder controller, den Sie unterstützen möchten, eine distinct-Abfrage, können Sie nicht 100% wissen im Voraus, welche Controller Ihre client-apps vielleicht möchten Sie diese Funktion auf, also die Funktionalität, die bereitgestellt wird, bevor Sie beginnen, Anpassungen.
Natürlich gibt es auch einen Nachteil dieses Ansatzes, dass es nicht lebensfähig 100% der Zeit:
Dies kann erfordern, dass Sie zusätzliche Felder in die Gruppierung der Aussage und für eine komplexe Filterung der daraus resultierende Datenbestand kann nicht zufriedenstellend sein, in diesen Fällen fanden wir es einfacher, unterstützen die Weitergabe in eine zusätzliche pre-filter-parameter, die über HTTP-header, die angewendet werden können, um die Abfrage aus, bevor die übergebene query-Optionen angewendet werden, beachten Sie, dass dies war nur notwendig, weil unsere filter-Bedingungen wurden Miet-und sicherheitsbezogene und so die daraus resultierenden Daten festgelegt hatte, viele mehr doppelte Einträge, wenn Sie ignoriert die Sicherheitsbeschreibungen.
Nur so zum Spaß, hier ist unsere benutzerdefinierte GET-Funktion, die für die pre-filter, wenn es weitergegeben wird:
Folgende Implementierung in einer Basisklasse, so dass wir nicht haben es in jedem controller:
Wenn nichts anderes, es ist günstiger, die versuchen zu verkaufen, AdaptiveLINQ zu Ihrem manager 🙂
wahr, aber $gelten nur funktioniert, wenn Sie nicht auch brauchen, um $filter, es sei denn, natürlich, Ihre $filter in Betrieb ist auf die Ergebnisse der Spalten in $gelten, und auch dann gibt es Einschränkungen. So, während ich hatte ein ähnliches problem nach der OP, als ich versucht habe, umzusetzen, meine einfache $gelten in meinem eigenen code zuerst habe ich schnell beschlossen, dass die Antwort, die benötigt werden, um mehr robust. Es war Spaß, hoffentlich jemand aus der ODataLib team nimmt Notiz und fügt einige ähnliche Unterstützung für uns später
InformationsquelleAutor Chris Schaller