2016-03-22 14 views
0

バージョン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; } 
} 
+0

AutoQuery DTOの外観はどのようなものですか?注:ワイルドカードはサポートされません。フィールドは、結合されたSqlExpressionのフィールドと1:1で一致させる必要があります。このフィールドは、RDBMSに送信されて、移入された結果セットを返すために使用されます。 – mythz

+0

AutoQuery DTOで質問を更新しました。ありがとう。 – jaybird

+0

これは非常に印象的なAutoQuery DTOです:) FYI返されるフィールドの選択に役立つ、 'employee。* 'という表のすべてのフィールドを指定できるワイルドカードのショートハンドを追加しました。 – mythz

答えて

0

サポートは、あなたが例えば、.*サフィックスを追加することによって、プライマリまたは結合されたテーブルのすべてのフィールドを指定することができin this commitを追加しました:

?fields=id,departmentid,department,employee.* 

これは基本的に、指定された表のすべてのフィールドに置き換えられる代替プレースホルダとして機能します。

この変更はv4.0.55から入手できます。現在はavailable on MyGetです。

関連する問題