Question

Étant donné une requête du type:

SELECT table1.field1 FirstField, table2.field2 SecondField
    FROM table1
    INNER JOIN table2 ON table1.FK = table2.PK
    WHERE table1.somefield = 'somevalue';

Mon objectif est de renvoyer un jeu de résultats fortement typé à l'aide de .netTiers. Je suppose que je ne peux pas utiliser une vue car la clause WHERE nécessite un paramètre, qui ne peut pas être transmis à une vue. Une procédure stockée peut recevoir le paramètre 'somevalue' mais renvoie un DataSet ou un DataReader faiblement typé.

Je suppose qu'il me manque juste un concept ici. Soyons clairs. Ce que je voudrais en venir, c’est d’être capable d’écrire quelque chose comme ceci:

TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );

foreach ( some-entity-name entity in entityList ) {
    DoSomethingWith( entity.FirstField, entity.SecondField );
}

J'aimerais éviter une solution qui implique un filtre côté serveur après l'exécution de la requête. les tables impliquées sont très grandes.

Était-ce utile?

La solution

Créez une vue et utilisez l'objet ParameterBuilder fortement typé pour filtrer la vue sur la colonne spécifique. Je ne me souviens plus très bien de la couche dans laquelle se trouve cet objet.

Voici comment vous l'utiliseriez:

MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());

Je me trompe peut-être, mais je ne crois pas que net-tiers "filtre" en fait l'objet TList / VList avec la méthode ci-dessus, ce que le nom de l'objet suggérerait. Le générateur génère là la clause where et nettiers lance une requête sur votre base de données à l'aide de cette clause.

Votre deuxième option consiste à essayer de générer une procédure stockée, mais uniquement si le jeu de résultats de votre proc stocké correspond au schéma de l'une des tables de votre base de données. Sinon, les tiers-réseaux ne sauront pas comment générer contre cela. Vous pouvez en savoir plus sur ce ici / p>

Autres conseils

Si vous souhaitez une collection TList avec une jointure, vous devez créer une procédure stockée personnalisée. Solution ici: http://benpowell.org/ pagination-et-tri-dans-un-client-personnalisé-stocké-procédure /

Si vous avez un scénario comme celui-ci:

  • Compte (PK AccountId)
  • Client (PK ClientId)
  • ClientAccount (PK ClientId, AccountId)

Tant que vous avez configuré correctement les clés étrangères, .NetTiers vous fournira la méthode appropriée:

AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);

Une méthode surchargée générée prend également en charge la pagination (malheureusement, aucune clause orderBy).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top