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.

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top