2

Also arbeite ich mit ServiceStack, und kenne mich ein bisschen damit aus. Ich habe AutoQuery verwendet und finde es unentbehrlich, wenn ich gerade "GET" -Nachrichten anrufe. Ich habe aber ein Problem, und ich habe das für ein paar Stunden angeschaut. Ich hoffe, es ist nur etwas, das ich übersehe.ServiceStack AutoQuery in benutzerdefinierten DTO

Ich habe eine einfache Klasse für meine AutoQuery Nachricht ein:

public class QueryCamera : QueryDb<db_camera> 
{ 
} 

Ich habe eine OrmLite Verbindung, die verwendet wird db_camera entires aus der Datenbank abgerufen werden. Das alles funktioniert gut. Ich möchte kein Modell aus der Datenbank zurückgeben, aber als Ergebnis möchte ich ein DTO zurückgeben, das ich als eine andere Klasse definiert habe. So ist mit der Version von QueryDb, meine Anfrage Nachricht jetzt dem:

public class QueryCamera : QueryDb<db_camera, Camera> 
{ 
} 

Wo die Camera-Klasse ist meine DTO. Der Anruf wird weiterhin ausgeführt, aber ich erhalte keine Ergebnisse. Ich habe eine Mapper-Erweiterungsmethode ToDto() eingerichtet für die db_camera-Klasse, um eine Kamera-Instanz zurückzugeben.

Vielleicht bin ich nur an ServiceStack gewöhnt, was die Sache so einfach macht ... aber wie bekomme ich die obige AutoQuery-Anfrage, um die Zuordnung für meine Anfrage durchzuführen? Ist der Datenabruf jetzt eine manuelle Operation für mich, da ich die gewünschte Konvertierung festlege? Wo wird dann der Wert dieses Typs angeboten? Ist es jetzt meine Aufgabe, die Datenbank abzufragen, und dann ToDto() in meinen Datenmodellsätzen aufzurufen, um DTO-Objekte zurückzugeben?

BEARBEITEN: etwas anderes, das ich gerade beobachtet habe ... Ich bekomme immer noch die Zeilenanzahl von der zurückgegebenen Datenmenge in AutoQueryViewer, aber die Feldnamen sind der Datenmodellklasse db_camera und nicht Camera.

enter image description here

Antwort

3

Die QueryDb<From, Into> nicht in der Lage ist Ihre benutzerdefinierte DTO-Extension-Methode zu verwenden, ist es zu select a curated set of columns aus dem ausgeführten AutoQuery verwendet, die auch reference columns on joined tables verwendet werden können.

Wenn Sie auf dem DTO andere Namen als auf Ihrem Datenmodell haben möchten, können Sie mit einem [Alias]-Attribut den Namen Ihrer DB-Spalte zuordnen, damit Sie Ihre DTO-Eigenschaft beliebig benennen können. Auf der anderen Seite können Sie die Eigenschaft ändern, unter der die DTO-Eigenschaft serialisiert wird, z. B .:

[DataContract] 
public class Camera 
{ 
    [DataMember(Name = "Id")]  // serialized as `Id` 
    public camera_id { get; set; } // populated with db_camera.camera_id 

    [DataMember] 
    [Alias("model")]     // populated with db_camera.model 
    public CameraModel { get; set; } // serialized as `CameraModel` 
} 
Verwandte Themen