2

Also arbeite ich mit ServiceStack und liebe, was es bietet. Wir sind an einem Punkt angelangt, an dem ich eine abfragbare Daten-API implementieren muss ... bevor ich zu diesem Projekt kam, wurde eine halb-unterstützte OData-Implementierung durchgeführt. Ich würde es lieber nicht versuchen und durchweinen, um es zum Laufen zu bringen.AutoQuery Einblick benötigt

Was bringt mich zu AutoQuery. Ich möchte es mit unserer SQL Server-Datenbank versuchen. Ich schaue mir die Beispiele an http://docs.servicestack.net/autoquery-rdbms - aber ich kann nicht für das Leben von mir das zum Funktionieren bringen. Gibt es etwas, das mir hier fehlt?

Ich verwende ORMLite, um SQL abzufragen, und meine Integrationstests, die ich geschrieben habe, zeigen, dass es so funktioniert, wie ich es erwarten würde. Ich habe die OrmLiteConnectionFactory in dem Container registriert, sowie mein Repository, das es über die Abhängigkeitsinjektion verwendet.

-spezifischer Code so weit habe ich eine Art, und eine Nachricht, die auf QueryDb basiert:

public class Detail 
{ 
    public string Div { get; set; } 
    public string Reg { get; set; } 
} 

[Route("/report/detail")] 
public class DetailQuery : QueryDb<Detail> 
{ 
    public string[] Div { get; set; } 
    public string[] Reg { get; set; } 
} 

Die Nachricht, DetailQuery, durch meinen Dienst verwendet wird:

public class ReportService : Service 
{ 
    public object Get(DetailQuery dq) 
    { 
     // not sure what to put here? 
    } 
} 

Mit All das kann ich die AutoQuery-Dienstinstanz in der Admin-Schnittstelle sehen. Wenn ich mit der Abfrage-Schnittstelle spiele, treffe ich meinen Service-Endpunkt und sehe die Daten, die ich erwarte - Filterwerte in den Kollektionen 'Div' und 'Reg'. Was fehlt mir dafür, hier "nur zu arbeiten"? Ich habe in ServiceStack viel getan, indem ich vom Service aus auf meine Repositorys zugreife, aber ich versuche hier ein paar Einblicke zu bekommen, was AutoQuery hier in die Tabelle bringt. Ich habe noch kein "direktes" Beispiel dafür gesehen, wie das funktioniert ... oder suche ich nach einem Topf voll Gold, der einfach nicht da ist?

Antwort

3

AutoQuery arbeitet with just the Request DTO heißt es benötigt keine Service-Implementierung, so Anfrage:

[Route("/report/detail")] 
public class DetailQuery : QueryDb<Detail> 
{ 
    public string[] Div { get; set; } 
    public string[] Reg { get; set; } 
} 

Wenn aus /report/detail genannt wird abfragen, um die Detail RDBMS-Tabelle. Aber Ihre Eigenschaften hier müssen entweder mit einer Spalte in der Detail Tabelle übereinstimmen (zB Div oder Reg), um eine exakte Übereinstimmung zu haben (Standard), jedoch werden exakte Übereinstimmungen normalerweise nicht mit Arrays gemacht, die mit skalaren Werten wie a gemacht werden string, zB:

public string Div { get; set; } 
public string Reg { get; set; } 

Wenn Sie querying a collection Sie stattdessen würde ein iN Abfrage machen, wo die Werte Werteliste enthalten würde, in welchem ​​Fall sie normalerweise pluralized sind:

public string[] Divs { get; set; } 
public string[] Regs { get; set; } 

und kann mit aufgerufen werden :

/report/detail?Divs=A,B&Regs=C,D 

, die eine Abfrage ähnlich ausführen wird:

SELECT * FROM Detail WHERE Div IN ('A','B') AND Rev IN ('C','D') 

Wenn das nicht das Verhalten, das Sie es ein implicit convention, passen e braucht wollen.g:

public string[] DivBetween { get; set; } 

die dann query:

SELECT * FROM Detail WHERE Div BETWEEN 'A' AND 'B' 

Wenn wollte Sie könnten Sie override the AutoQuery service with a custom implementation, zB:

public class MyQueryServices : Service 
{ 
    public IAutoQueryDb AutoQuery { get; set; } 

    //Override with custom implementation 
    public object Any(DetailQuery query) 
    { 
     var q = AutoQuery.CreateQuery(query, base.Request); 
     return AutoQuery.Execute(request, q); 
    } 
} 

Aber Sie würden brauchen nur das zu tun, wenn Sie wollen um das Standardverhalten anzupassen, z fügen Sie einen zusätzlichen Filter zu dem aufgefüllten SqlExpression hinzu.

Verwandte Themen