.netTiersのJOINから厳密に型指定された結果が必要な場合
-
07-07-2019 - |
質問
次のようなクエリを指定します:
SELECT table1.field1 FirstField, table2.field2 SecondField
FROM table1
INNER JOIN table2 ON table1.FK = table2.PK
WHERE table1.somefield = 'somevalue';
私の目的は、.netTiersを使用して厳密に型指定された結果セットを返すことです。 WHERE
句にはビューに渡すことができないパラメーターが必要なため、ビューを使用できないと想定しています。ストアドプロシージャには 'somevalue'パラメータを渡すことができますが、弱い型指定の DataSet
または DataReader
を返します。
ここに概念が欠けているだけです。明確にするために、私が最終的に望むのは、次のようなものを書くことができるようにすることです。
TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );
foreach ( some-entity-name entity in entityList ) {
DoSomethingWith( entity.FirstField, entity.SecondField );
}
クエリの実行後にサーバー側のフィルターを使用するソリューションを避けたい。関係するテーブルは非常に大きいです。
解決
ビューを作成し、厳密に型指定されたParameterBuilderオブジェクトを使用して、特定の列でビューをフィルタリングします。このオブジェクトがどのレイヤーにあるのかをよく覚えていません。
次のように使用します:
MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());
間違っているかもしれませんが、ネット層が実際に上記のメソッドでTList / VListオブジェクトを「フィルタリング」することは信じていません。これはオブジェクトの名前が示唆するものです。ビルダーはwhere句を生成し、nettiersはこの句を使用してデータベースに対してクエリを実行します。
2番目のオプションは、ストアドプロシージャの結果セットがデータベース内のいずれかのテーブルのスキーマと一致する場合にのみ、ストアドプロシージャの生成を試みることです。そうしないと、ネット層はそれに対して生成する方法を知りません。詳細については、こちら
をご覧ください。他のヒント
結合付きのTListコレクションが必要な場合は、カスタムストアドプロシージャを作成する必要があります。ここでの解決策: http://benpowell.org/ nettiers-custom-stored-procedureのページングとソート/
次のようなシナリオがある場合:
- アカウント(PK AccountId)
- クライアント(PK ClientId)
- ClientAccount(PK ClientId、AccountId)
正しい外部キーが設定されている限り、.NetTiersは適切な方法を提供します:
AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);
ページングをサポートするオーバーロードメソッドも生成されます(残念ながらorderBy句はありません)。