2009-06-01 6 views
1

J'ai une requête où j'ai besoin de faire une clause "Where" pour deux colonnes différentes dans deux tables différentes mais subsonic crée le même nom de paramètre paramétré pour les deux qui cause un problème. Comment puis-je réparer cela?Subsonic: même nom de colonne différentes tables

string _RawSql = new Select() 
    .From(Tables.Table1) 
    .InnerJoin(Tables.Table2) 
    .InnerJoin(Table3.SidColumn, Table2.Table3SidColumn) 
    .Where(Table1.SidColumn).IsEqualTo(2) 
    .And(Table3.SidColumn).IsEqualTo(1) 
    .BuildSqlStatement(); 

La requête cela crée est

SELECT .... 
FROM [dbo].[Table1] 
INNER JOIN [dbo].[Table2] ON [dbo].[Table1].[Table2Sid] = [dbo].[Table2].[Sid] 
INNER JOIN [dbo].[Table3] ON [dbo].[Table2].[Table3Sid] = [dbo].[Table3].[Sid] 
WHERE [dbo].[Table1].[Sid] = @Sid 
AND [dbo].[Table3].[Sid] = @Sid 

Notez que dans les deux dernières lignes de son utilisation de @Sid pour Table1 et Table3. Comment vais-je faire pour qu'il utilise @ Sid0 et @ Sid1?

Toute aide serait appréciée. Merci


Merci pour la réponse, je l'apprécie vraiment. J'utilise 2.1 J'utilise déjà TableColumn. Ci-dessous le code C# subsonique ...

.Where(Table1.SidColumn).IsEqualTo(2) 
.And(Table3.SidColumn).IsEqualTo(1) 

qui crée l'instruction SQL suivante vue dans sql profileur

WHERE [dbo].[Table1].[Sid] = @Sid 
AND [dbo].[Table3].[Sid] = @Sid 

Pourriez-vous s'il vous plaît me montrer comment puis-je remplacer ces lignes avec la façon dont vous suggérez ? Je préfère ne pas vraiment utiliser littérale « Table2.Sid = 2 »


Ranmore, la question est la même avec des variables ou constantes.

J'ai même essayé

.Where("Table1.Sid").IsEqualTo(2) 
.And("Table3.Sid").IsEqualTo(1) 

Cela crée la requête comme

WHERE Table1.Sid = @Table1.Sid0 
AND Table3.Sid = @Table3.Sid1 

Je reçois enfin différentes vars paramétrées dans ce cas, mais maintenant SQL Server se plaint parce qu'il ne l'aime pas. dans les noms de variables paramétrés.

Je n'ai aucune idée de comment effectuer une jointure avec 2 clauses where pour 2 tables différentes!

Répondre

1

Quelle version utilisez-vous? Dans 2.2 Vous pouvez utiliser l'objet TableColumn pour contourner cela (il peut être le même pour 2.1.) Ainsi, au lieu d'utiliser la structure, comme vous le faites, vous pouvez utiliser l'objet (Table2.SidColumn)

Si les choses se gâtent - vous pouvez remplacer tout avec une chaîne -. dans votre cas, vous pouvez utiliser « Table1.Sid » et « Table2.Sid » droit dans la méthode where()

+0

Aucun @Rob même 2.2 ne vous aide pas S'il vous plaît voir ma question ici: http://stackoverflow.com/questions/1061851/column-with-same-name-in-multiple-tables-causing-problem-in-subsonic -sélectionner – TheVillageIdiot

0

Je n'ai pas été en mesure de confirmer cela, mais peut-être le problème se produit uniquement avec littéraux? (pas sûr si votre code d'échantillon est comme ça pour des raisons de brièveté)

int table1SidColumnValue = 2; 
int table3SidColumnValue = 1; 

.Where(Table1.SidColumn).IsEqualTo(table1SidColumnValue) 
.And(Table3.SidColumn).IsEqualTo(table2SidColumnValue) 

Je me souviens avoir vu un problème avec quand En utilisant plusieurs clauses .In() avec des valeurs littérales, vous ne savez pas si cela s'applique à votre problème.

0

Je ne suis pas sûr de la version du code que j'ai, mais votre requête produit des paramètres numérotés pour moi.

Si vous regardez la ligne 255 de ANSISqlGenerator.cs https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/SqlQuery/SqlGenerators/ANSISqlGenerator.cs

c.ParameterName = String.Concat(col.ParameterName, query.Constraints.IndexOf(c)); 

Les paramètres où doivent vraiment avoir des numéros associés à eux ... peut-être tirer la dernière version?

Questions connexes