QueryModel (クエリモデル)
一覧検索処理に特化したデータモデルを表します。 フィルタリング、ソート、ページングといった処理が自動生成され、アプリケーションは検索条件オブジェクトを渡すだけで簡単に検索結果の一覧を受け取ることが可能です。
自動生成されるモジュール
クエリモデルの定義1個から、以下のモジュールが自動生成されます。
1. C# / TypeScript データ構造体・型定義
- SearchConditionクラス: 画面から指定する検索条件の型定義。文字列の部分一致、数値の範囲検索、参照先の属性検索などが自動生成されます。
- SearchResultクラス: クエリの動的構築に使われるC#クラス。おおよそ「SQLのSELECT句と対応している」との理解で十分。
- DisplayDataクラス: 検索結果として返されるデータの型定義。一覧画面の行データとして使用されます。
2. 検索処理メソッド
- 検索処理 (
Load...): 検索条件を受け取り、検索結果を返すメソッド。- 開発者が実装した
CreateQuerySourceメソッド(またはDB View)からベースとなるクエリを取得します。 - 検索条件に基づいてWHERE句, ORDER BY句を動的に付加します。
- 件数カウント、ソート、ページングを実行して結果を返します。
- 開発者が実装した
- Web API エンドポイント: 検索処理を呼び出すためのREST APIエンドポイント(Controller)が生成されます。フロントエンドからHTTPリクエストを送ることで検索を実行できます。
3. 拡張ポイント
CreateQuerySource: DataModelからQueryModelへの変換ロジック(IQueryableを返すLINQ)を実装するためのメソッド。DB Viewにマッピングする場合は実装不要です。また、自動生成されない複雑な検索条件はここで実装してください。OnAfterLoaded: 検索結果をC#のメモリ上に読み込んだあとの処理。検索結果をC#で加工するのに使います。SQLで表現しきれないような加工を行う場合に使います。
詳細は リファレンス を参照してください。
設計指針
1. クエリモデルの粒度
クエリモデルは、単に ユーザーが一覧検索する粒度 で定義してください。つまり、ほぼ「画面項目定義」の粒度とイコールで考えて問題ありません。 従業員一覧検索であれば「従業員データ」、受注一覧検索であれば「受注データとその明細情報」「受注ヘッダと明細の合計金額」といったように、ユーザーが求める情報の粒度がクエリモデルの単位になります。
2. 実装パターン
QueryModelの実装には、大きく分けて2つのパターンがあります。
- DataModelからの直接射影:
- 単純な一覧画面など、DataModelの構造をほぼそのまま表示する場合に使用します。
- 開発者は、DataModelからQueryModelへの変換ロジック(LINQ)を実装します。
- Nijoの機能により、動的なフィルタリングやソートは自動的に適用されます。
- データベースViewへのマッピング:
- 複雑な集計や結合が必要な場合、またはパフォーマンスチューニングが必要な場合に使用します。
- 開発者はビューを作成する必要があります。
- この場合、LINQによる変換ロジックの実装は不要で、DB上のViewに対して直接クエリが発行されます。
3. 参照関係と検索
QueryModelにおける参照(ref-to)は、検索機能の強化に利用されます。
QueryModelに他のモデルへの参照を定義しておくと、 参照先の属性を使った検索 が可能になります。
例えば、受注一覧 QueryModel が 担当者 を参照している場合、検索条件として「担当者の氏名」や「担当者の所属部署」を指定できるようになります。
なお、パフォーマンスに注意が必要な場合は、1つのデータに対し必要に応じて複数のクエリモデルを定義することも検討してください。 例えば従業員が「ID、氏名、所属部署一覧」を持っており、受注画面で従業員を表示する必要があるが、そこでは「ID、氏名」だけが必要で、しかも所属部署の取得がパフォーマンスの悪化をもたらしているような場合、「ID、氏名」だけを持つ別の従業員クエリモデルを定義し、受注画面からはそちらを参照させることでパフォーマンスの改善を図ることができます。
4. 自動生成できない複雑な検索条件
Nijoは、文字列の部分一致や数値の範囲指定といった一般的な検索条件を自動生成しますが、業務要件によっては例えば「緊急対応のみ抽出する(未出荷かつ受注日が3日以上前のもの)」といった複雑な検索条件が必要になることがあります。
このような場合、QueryModelの属性に OnlySearchCondition オプションを指定することで、検索条件入力欄としてのみ機能し、検索結果の一覧には表示されない項目 を定義できます。
- 定義: nijo.xml で属性に
OnlySearchConditionを指定します。 - 実装: 自動生成された
CreateQuerySourceメソッド内で、その検索条件が指定された場合のフィルタリング処理(Where句)をC#で実装します。
これにより、画面上は専用の検索項目として見せつつ、内部的には任意の複雑なロジックでデータを絞り込むことが可能になります。