バージョン4.0.55( "MyGet"のプレリリース)で "?Fields ="を使用すると、異常が検出されました。ServiceStack AutoQuery - "Fields ="使用時の異常
私たちは、3 1とEmployeeテーブルを持っている:1の関係 - はEmployeeType、部門やタイトル:4.0.55への最新のアップデートは、関連のDTOはこのようなクエリ文字列に?Fields=
を使用して要求することができます
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; }
}
:関連DTO(部門)を要求するために「適切」な方法は、外部キーフィールド(この場合のDepartmentIDを、)も要求することであることを
/employees?fields=id,firstname,lastname,departmentid,department
注意。
テストでは、我々は、この要求が機能することがわかったので、Employeeテーブルのすべてのフィールドのみ選択された関連のDTOを返す方法があった場合我々は疑問に思っ:
/employees?fields=department
を私たちは、すべての従業員テーブルのフィールドを取り戻します従業員のIDフィールドに従業員のTitleIDの値が入力されています。には、奇妙なものが1つあります。
/employees?fields=id,departmentid,department
しかし、我々は、他の従業員のすべてのフィールドを失う:異常リクエストの修正に外部キーフィールドを指定
。
Employeeフィールドと選択された関連DTOをすべて取得する方法はありますか?ここで
は、私たちの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; }
}
AutoQuery DTOの外観はどのようなものですか?注:ワイルドカードはサポートされません。フィールドは、結合されたSqlExpressionのフィールドと1:1で一致させる必要があります。このフィールドは、RDBMSに送信されて、移入された結果セットを返すために使用されます。 – mythz
AutoQuery DTOで質問を更新しました。ありがとう。 – jaybird
これは非常に印象的なAutoQuery DTOです:) FYI返されるフィールドの選択に役立つ、 'employee。* 'という表のすべてのフィールドを指定できるワイルドカードのショートハンドを追加しました。 – mythz