質問

次のようなクエリを指定します:

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句はありません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top