Wir haben eine Anomalie festgestellt, wenn Sie "? Felder =" in Version 4.0.55 (Vorabversion auf MyGet) verwenden.ServiceStack AutoQuery - Anomalie beim Verwenden von "? Fields ="
Wir haben eine Employee-Tabelle mit drei 1: 1-Beziehungen - EmployeeType, Abteilung und Titel:
public partial class Employee {
[PrimaryKey]
[AutoIncrement]
public int ID { get; set; }
[References(typeof(EmployeeType))]
public int EmployeeTypeID { get; set; }
[References(typeof(Department))]
public int DepartmentID { get; set; }
[References(typeof(Title))]
public int TitleID { get; set; }
.
.
.
}
public class EmployeeType {
[PrimaryKey]
public int ID { get; set; }
public string Name { get; set; }
}
public class Department {
[PrimaryKey]
public int ID { get; set; }
public string Name { get; set; }
[Reference]
public List<Title> Titles { get; set; }
}
public class Title {
[PrimaryKey]
public int ID { get; set; }
[References(typeof(Department))]
public int DepartmentID { get; set; }
public string Name { get; set; }
}
Das neueste Update auf 4.0.55 ermöglicht damit verbundene DTOs angefordert wird unter Verwendung von ?Fields=
auf dem Query-String wie folgt aus :
/employees?fields=id,firstname,lastname,departmentid,department
Beachten Sie, dass die „richtige“ Art und Weise ein verwandtes DTO (Abteilung) zu beantragen ist auch auf das Fremdschlüsselfeld (DepartmentID, in diesem Fall) anfordern.
Wir fragten uns, ob es einen Weg war all die Mitarbeitertabellenfelder und nur ausgewählte Zusammenhang DTOs zurückzukehren, so bei der Prüfung haben wir festgestellt, dass dieser Antrag funktioniert:
/employees?fields=department
Wir bekommen wieder alle Mitarbeiter Tabellenfelder plus die zugehörige Abteilung DTO - mit einer seltsamen Sache - das Feld ID des Mitarbeiters ist mit den TitleID Werten des Mitarbeiters ausgefüllt.
das Fremdschlüsselfeld in der Anforderung angeben behebt diese Anomalie:
/employees?fields=id,departmentid,department
aber wir verlieren alle anderen Mitarbeiter Felder.
Gibt es eine Möglichkeit, alle Employee-Felder abzurufen und verwandte DTOs auszuwählen?
Hier ist unser AutoQuery DTO:
[Route("/employees", "GET")]
public class FindEmployeesRequest : QueryDb<Employee>,
IJoin<Employee, EmployeeType>,
IJoin<Employee, Department>,
IJoin<Employee, Title> {
public int? ID { get; set; }
public int[] IDs { get; set; }
public string UserID { get; set; }
public string[] UserIDs { get; set; }
public int? EmployeeTypeID { get; set; }
public int[] EmployeeTypeIDs { get; set; }
public int? DepartmentID { get; set; }
public int[] DepartmentIDs { get; set; }
public int? TitleID { get; set; }
public int[] TitleIDs { get; set; }
public string LastNameStartsWith { get; set; }
public DateTime[] DateOfBirthBetween { get; set; }
public DateTime[] HireDateBetween { get; set; }
public bool? IsActive { get; set; }
[QueryDbField(Template = "(MONTH({Field}) = {Value})", Field = "DateOfBirth")]
public int? BirthMonth { get; set; }
[QueryDbField(Template = "(DAY({Field}) = {Value})", Field = "DateOfBirth")]
public int? BirthDay { get; set; }
[QueryDbField(Template = "(FirstName LIKE {Value} OR LastName LIKE {Value} OR PreferredName LIKE {Value})", ValueFormat = "%{0}%", Field = "ID")]
public string NameSearch { get; set; }
[QueryDbField(Template = "(FirstName LIKE {Value} OR LastName LIKE {Value} OR PreferredName LIKE {Value} OR Department.Name LIKE {Value} OR Title.Name LIKE {Value})", ValueFormat = "%{0}%", Field = "ID")]
public string BasicSearch { get; set; }
[QueryDbField(Template = "({Field} LIKE {Value})", Field = "EmployeeTypeName", ValueFormat = "%{0}%")]
public string EmployeeTypeSearch { get; set; }
[QueryDbField(Template = "({Field} LIKE {Value})", Field = "DepartmentName", ValueFormat = "%{0}%")]
public string DepartmentSearch { get; set; }
[QueryDbField(Template = "({Field} LIKE {Value})", Field = "TitleName", ValueFormat = "%{0}%")]
public string TitleSearch { get; set; }
}
Wie sieht Ihr AutoQuery DTO aus? Hinweis: Platzhalter werden nicht unterstützt, Felder müssen 1: 1 mit Feldern in der verknüpften SqlExpression übereinstimmen, die zum Konstruieren des zugrunde liegenden SELECT verwendet werden, das an das RDBMS gesendet wird, um das bestückte Resultset zurückzugeben. – mythz
Ich habe die Frage mit unserem AutoQuery DTO aktualisiert. Vielen Dank. – jaybird
Das ist ein ziemlich beeindruckendes AutoQuery-DTO :) Zu Ihrer Information: Ich habe eine Platzhalterkurzschrift hinzugefügt, in der Sie alle Felder in einer Tabelle mit 'employee. *' Angeben können, die Ihnen bei der Auswahl der Felder helfen soll. – mythz