Desideri un risultato fortemente tipizzato da un JOIN in .netTiers
-
07-07-2019 - |
Domanda
Data una query come:
SELECT table1.field1 FirstField, table2.field2 SecondField
FROM table1
INNER JOIN table2 ON table1.FK = table2.PK
WHERE table1.somefield = 'somevalue';
Il mio obiettivo è di restituire un set di risultati fortemente tipizzato utilizzando .netTiers. Presumo che non sia possibile utilizzare una vista perché la clausola WHERE
necessita di un parametro, che non può essere passato a una vista. Una procedura memorizzata può essere passata al parametro 'somevalue' ma restituisce un DataSet
o DataReader
digitato in modo debole.
Immagino che mi stia solo perdendo un concetto qui. Giusto per essere chiari, quello che mi piacerebbe finire è riuscire a scrivere qualcosa del genere:
TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );
foreach ( some-entity-name entity in entityList ) {
DoSomethingWith( entity.FirstField, entity.SecondField );
}
Vorrei evitare una soluzione che coinvolga un filtro lato server dopo l'esecuzione della query; i tavoli coinvolti sono molto grandi.
Soluzione
Crea una vista e usa l'oggetto ParameterBuilder fortemente tipizzato per filtrare la vista sulla colonna specifica. Non ricordo bene in quale livello si trovi questo oggetto.
Ecco come lo useresti:
MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());
Potrei sbagliarmi, ma non credo che i livelli di rete 'filtrino' effettivamente l'oggetto TList / VList con il metodo sopra, che è ciò che il nome dell'oggetto suggerirebbe. Il builder genera lì dove clausola e nettiers esegue una query sul database usando questa clausola.
La tua seconda opzione è provare a generare una procedura memorizzata, ma solo se il set di risultati del tuo proc memorizzato corrisponde allo schema di una delle tabelle nel tuo database. Altrimenti, i livelli di rete non sapranno come generarlo. Puoi leggere ulteriori informazioni su qui
Altri suggerimenti
Se si desidera una raccolta TList con un join, è necessario creare una procedura memorizzata personalizzata. Soluzione qui: http://benpowell.org/ paging-e-di smistamento-in-a-NetTiers-custom-immagazzinata-procedure /
Se hai uno scenario come questo:
- Account (PK AccountId)
- Client (PK ClientId)
- ClientAccount (PK ClientId, AccountId)
Finché hai impostato correttamente le chiavi esterne, .NetTiers ti fornirà il metodo appropriato:
AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);
Esiste anche un metodo sovraccarico generato che supporta il paging (purtroppo nessuna clausola OrderBy).