2009-09-13 7 views
1

Étant donné une requête comme:Vous voulez un résultat fortement typées d'un JOIN dans .netTiers

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 retourner un jeu de résultats fortement typé en utilisant .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 passé à une vue. Une procédure stockée peut être transmise au paramètre 'somevalue' mais renvoie une valeur DataSet ou DataReader faiblement typée.

Je me dis qu'il me manque un concept ici. Pour être clair, ce que je voudrais finir avec est de pouvoir é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); 
} 

Je voudrais éviter une solution qui implique un filtre côté serveur Une fois la requête réalisé; les tables impliquées sont très grandes.

+0

Vous pouvez utiliser une vue, y compris la clause 'WHERE'. –

Répondre

2

Créez une vue et utilisez l'objet ParameterBuilder fortement typé pour filtrer la vue sur la colonne spécifique. Je ne me souviens pas tout à fait ce que la couche de cet objet est dans

Voici comment vous l'utilisez.

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

Je peux me tromper, mais je ne crois pas nets niveaux en fait des « filtres » la TList/VList objet avec la méthode ci-dessus, qui est ce que le nom de l'objet suggère. Le générateur génère là où clause et nettiers lance une requête sur votre base de données en utilisant cette clause.

Votre 2è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ée correspond au schéma de l'une des tables de votre base de données. Sinon, net-tiers ne saura pas comment générer par rapport à cela. Vous pouvez en savoir plus sur ce here

+0

Merci de m'avoir mis sur la bonne voie. Pour les visiteurs suivants, je suis obligé d'offrir quelques corrections: MyViewEntityParameterBuilder devrait être MyViewParameterBuilder, et AppendEqual devrait être AppendEquals. –

+0

Merci. Je vais le corriger dans le post :) –

0

Si vous voulez une collection TList avec une jointure, vous devrez créer une procédure stockée personnalisée. Solution ici: http://benpowell.org/paging-and-sorting-in-a-nettiers-custom-stored-procedure/

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

  • compte (PK AccountId)
  • client (PK ClientId)
  • ClientAccount (PK ClientId, AccountId)

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

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

Il existe également une méthode surchargée qui prend en charge la pagination (malheureusement pas de clause orderBy).

+0

Vous pouvez utiliser Linq pour faire une commande par comme ça ... DataRepository.BlahProvider.GetAll(). OrderByDescending() –

+0

@Dave Hanson on pourrait utiliser un certain nombre d'ORM alternatives qui sont plus fonctionnel que .NetTiers mais ce n'était pas ce que l'op demandé. – Junto

Questions connexes