最近、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 */