3

最近、ServiceStack AutoQuery の使用を開始しました。それは素晴らしい機能であり、私たちはそれを本当に楽しんでいました. 次のようなテーブル構造があります (読みやすいように縮小版)。

Salary [Id (PK), ManagerId (FK)] 
Manager [Id (PK), DepartmentId (FK)] /* Manager is like Employee table even thought it's named Manager */
Department [Id (PK), ActiveManagerId (FK)] /* The FK ActiveManagerId is supposed to be a shortcut, it's Nullable.  */

理論的には、そのような結合を持つことができます

Salary -> Manager via Salary.ManagerId = Manager.Id
Manager -> Department via Manager.DepartmentId = Department.Id
Department -> Manager via Department.ActiveManagerId = Manager.Id

ただし、この特定のケースでは、Department.ActiveManagerId = Manager.Id を介して Department から Manager に参加すると、Department.ActiveManagerId はショートカットであり、他のシナリオ用に設計されているため、正しい結果が生成されません。

したがって、AutoQueryをそのように定義すると

public class SalaryQuery : QueryBase<Salary, SalaryQueryResult>,
 ILeftJoin<Salary, Manager, Department>

以下の SQL は AutoQuery によって生成されますが、これは ServiceStack AutoQuery の観点からは正しいものです。

select  s.Id
    ,   d.Id
from    Salary s
    left join
        Manager m
    on  s.ManagerId = m.Id
    left join
        Department d
    on  d.ActiveManagerId = m.Id /* should NOT use shortcut: Department -> Manager via Department.ActiveManagerId = Manager.Id */

しかし代わりに、このような SQL を生成する機能が必要です

select  s.Id
    ,   d.Id
from    Salary s
    left join
        Manager m
    on  s.ManagerId = m.id
    left join
        Department d
    on  d.Id = m.DepartmentId /* should use the desired FK: Manager -> Department via Manager.DepartmentId = Department.Id */
4

1 に答える 1

3

別の JOIN 動作が必要な場合は、カスタム AutoQuery 実装にカスタム LEFT JOIN を追加する必要があります。例:

//AutoQuery DTO
public class SalaryQuery : QueryDb<Salary,SalaryQueryResult>, ILeftJoin<Salary,Manager>

//Implementation
public class MyServices : Service
{
    public IAutoQueryDb AutoQuery { get; set; }

    public object Any(SalaryQuery query)
    {
        var q = AutoQuery.CreateQuery(query, base.Request)
            .LeftJoin<Manager, Department>((m, d) => d.Id == m.DepartmentId);

        return AutoQuery.Execute(query, q);
    } 
}

注: v4.0.56 以降QueryBase<T>は廃止され、名前が QueryDb に変更されました。

于 2016-05-02T07:03:00.793 に答える