2009-07-29 7 views
1

Je souhaite effectuer une jointure simple sur deux tables (BusinessUnit et UserBusinessUnit), afin que je puisse obtenir une liste de tous les BusinessUnits alloués à un utilisateur donné.Subsonic 3 Simple Query syntaxe de jointure interne

La première tentative fonctionne, mais il n'y a pas override de Select qui me permet de limiter les colonnes retournées (je reçois toutes les colonnes des deux tables):

var db = new KensDB(); 
SqlQuery query = db.Select 
.From<BusinessUnit>() 
.InnerJoin<UserBusinessUnit>(BusinessUnitTable.IdColumn, UserBusinessUnitTable.BusinessUnitIdColumn) 
.Where(BusinessUnitTable.RecordStatusColumn).IsEqualTo(1) 
.And(UserBusinessUnitTable.UserIdColumn).IsEqualTo(userId); 

La deuxième attept permet la restriction de nom de la colonne, mais le SQL généré contient les noms de table pluralisés (?)

SqlQuery query = new Select(new string[] { BusinessUnitTable.IdColumn, BusinessUnitTable.NameColumn }) 
.From<BusinessUnit>() 
.InnerJoin<UserBusinessUnit>(BusinessUnitTable.IdColumn, UserBusinessUnitTable.BusinessUnitIdColumn) 
.Where(BusinessUnitTable.RecordStatusColumn).IsEqualTo(1) 
.And(UserBusinessUnitTable.UserIdColumn).IsEqualTo(userId); 

... produit

SELECT [BusinessUnits].[Id], [BusinessUnits].[Name] 
FROM [BusinessUnits] 
INNER JOIN [UserBusinessUnits] 
ON [BusinessUnits].[Id] = [UserBusinessUnits].[BusinessUnitId] 
WHERE [BusinessUnits].[RecordStatus] = @0 
AND [UserBusinessUnits].[UserId] = @1 

Donc, deux questions:
- Comment limiter les colonnes retournées dans la méthode 1?
- Pourquoi Does method 2 pluralise les noms de colonnes dans la SQL généré (et puis-je contourner cela?)

J'utilise 3.0.0.3 ...

Répondre

2

Jusqu'à présent, mon expérience avec 3.0.0.3 suggère que cela est impossible encore avec l'outil de requête, bien qu'il soit avec la version 2.

Je pense que la méthode préférée (jusqu'à présent) avec la version 3 est d'utiliser une requête LINQ avec quelque chose comme:

var busUnits = from b in BusinessUnit.All() 
join u in UserBusinessUnit.All() on b.Id equals u.BusinessUnitId 
select b; 
1

J'ai couru au pluriel La table d me nomme moi-même, mais c'était parce que je ne faisais que ré-exécuter un template après avoir fait des changements de schéma.

Une fois que j'ai réexécuté tous les modèles, les noms de plusieurs tables ont disparu. Essayez de réexécuter les 4 modèles et voyez si cela résout le problème pour vous.