2009-06-01 14 views
1

Ich habe eine Abfrage, wo ich eine "Where" -Klausel für zwei verschiedene Spalten in zwei verschiedenen Tabellen tun muss, aber subsonic erzeugt den gleichen parametrisierten Parameternamen für beide, die ein Problem verursacht. Wie kann ich das beheben?Subsonic: Gleiche Spaltenname verschiedene Tabellen

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(); 

Die Abfrage dieser zu schaffen, ist

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 

anzumerken, dass in den letzten beiden Zeilen für seine Verwendung sowohl @Sid Tabelle1 und Table3. Wie gehe ich es so, dass es @ Sid0 und @ Sid1 verwendet?

Jede Hilfe wäre willkommen. Danke


Danke für die Antwort, ich schätze es wirklich. Ich verwende 2.1 Ich verwende bereits TableColumn. Subsonic-Code unten ist der C# ...

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

, die folgende SQL erstellt, wenn in SQL Profiler betrachtet

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

Könnten Sie mir bitte zeigen, wie kann ich diese Zeilen mit der Art und Weise ersetzen Sie vorschlagen ? Ich würde wirklich lieber nicht wörtlich verwenden „Table2.Sid = 2“


Ranmore, ist die Frage gleiche mit Variablen oder mit Konstanten.

Ich habe sogar versucht,

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

Dies schafft die Abfrage als

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

ich endlich anders parametrisiert Vars in diesem Fall erhalten, aber jetzt SQL Server beschwert, weil es nicht mag. in den parametrisierten Var-Namen.

Ich habe keine Ahnung, wie man eine Verbindung mit 2 Where-Klauseln für 2 verschiedene Tabellen durchführt!

Antwort

1

Welche Version verwenden Sie? In 2.2 können Sie das TableColumn-Objekt verwenden, um dies zu umgehen (es kann auch für 2.1 dasselbe sein.) So können Sie das Objekt (Table2.SidColumn) anstelle der Struktur verwenden, wie Sie tun.

Wenn Push kommt - Sie können alles mit einem String überschreiben - so in Ihrem Fall könnten Sie "Table1.Sid" und "Table2.Sid" rechts in der Where() Methode verwenden.

+0

Nein @Rob sogar 2.2 hilft nicht Bitte sehen Sie meine Frage hier: http://StackOverflow.com/Questions/1061851/column-with-Same-Name-in-Multiple-Tables-Causing-Problem-in-Subsonic -wählen – TheVillageIdiot

0

Ich war nicht Lage, dies zu bestätigen, aber vielleicht geschieht das Problem nur mit Literalen? (nicht sicher, ob Ihr Codebeispiel der Kürze halber wie das heißt)

int table1SidColumnValue = 2; 
int table3SidColumnValue = 1; 

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

ich sehe, erinnere ein Problem damit, wenn Verwenden Sie mehrere .In() -Klauseln mit Literalwerten, nicht sicher, ob das für Ihr Problem gilt.

Verwandte Themen