2009-06-01 25 views
1

2つの異なるテーブルの2つの異なる列に対して「Where」句を実行する必要があるが、サブソニックで問題の原因となっている両方に対して同じパラメータ化されたパラメータ名が作成されます。これをどうすれば解決できますか?Subsonic:同じ列名の異なるテーブル

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

これが作成されるクエリは、最後の2行に、そのは表1と表3の両方に@Sidを使用して、その

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 

注あります。どのようにして@ Sid0と@ Sid1を使うようにするのですか?

ご協力いただければ幸いです。ありがとう


私は本当に感謝しています。私は2.1を使用しています 私はすでにTableColumnを使用しています。以下は、SQLプロファイラで

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

を見たときは、次のSQLを作成します

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

はあなたが私はあなたが示唆されている方法でこれらの行を置き換えることができますどのように私を示してもらえ... C#の亜音速コードです?私は本当にむしろリテラル "Table2.Sid = 2"を使用しないでください


ranmore、問題は変数または定数で同じです。

私も

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

を試してみましたが、これは

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

私は最終的にこのケースで異なるパラメータ化VARSを得るが、それは好きではないので、今SQL Serverは文句のようにクエリを作成します。パラメータ化されたvar名で

2つの異なるテーブルのwhere句を使用して結合を実行する方法がわかりません!

答えて

1

どのバージョンをお使いですか? 2.2では、TableColumnオブジェクトを使用してこれを回避することができます(これは2.1の場合と同じです)ので、構造体を使用する代わりに、オブジェクト(Table2.SidColumn)を使用できます。

pushが押されると、すべての文字列をオーバーライドすることができます。その場合は、Where()メソッドで「Table1.Sid」と「Table2.Sid」を使用することができます。

+0

@Robも役に立たない。ここで私の質問を参照してください:http://stackoverflow.com/questions/1061851/column-with-same-name-in-multiple-tables-causing-problem-in-subsonic -select – TheVillageIdiot

0

私はこのときに問題を見て覚えて

int table1SidColumnValue = 2; 
int table3SidColumnValue = 1; 

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

これを確認、おそらく問題はリテラルだけで発生することができ?(あなたのサンプルコードは、簡潔のためにそのようなものであるかどうかわかりません)リテラル値を持つ複数の.In()節を使用しますが、それがあなたの問題にも当てはまるかどうかはわかりません。

0

私は持っているコードのバージョンはわかりませんが、クエリでは番号付きのパラメータが生成されます。

ANSISqlGeneratorの255行目を見てください。パラメータが実際の数字はそれに添付されている必要があります https://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/SqlQuery/SqlGenerators/ANSISqlGenerator.cs

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

ザ・は...多分、最新バージョンを引くCS?

関連する問題