我有一个查询,我需要在两个不同的表中为两个不同的列执行“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();
此创建的查询是
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
请注意,在最后两行中,它使用@Sid作为Table1和Table3。我怎么做,所以它使用@ Sid0和@ Sid1?
任何帮助将不胜感激。感谢
感谢您的回复,我真的很感激。我正在使用2.1 我已经在使用TableColumn了。下面是c#亚音速代码......
.Where(Table1.SidColumn).IsEqualTo(2)
.And(Table3.SidColumn).IsEqualTo(1)
在sql profiler中查看时创建以下sql
WHERE [dbo].[Table1].[Sid] = @Sid
AND [dbo].[Table3].[Sid] = @Sid
请您告诉我如何以您建议的方式更换这些线?我真的不想使用文字“Table2.Sid = 2”
ranmore,问题与变量或常量相同。
我甚至尝试过
.Where("Table1.Sid").IsEqualTo(2)
.And("Table3.Sid").IsEqualTo(1)
这会将查询创建为
WHERE Table1.Sid = @Table1.Sid0
AND Table3.Sid = @Table3.Sid1
在这种情况下我终于获得了不同的参数化变量,但现在SQL Server抱怨因为它不喜欢。在参数化的var名称中。
我不知道如何使用2个不同表格的2 where子句执行连接!
答案 0 :(得分:1)
您使用的是哪个版本?在2.2中您可以使用TableColumn对象来解决这个问题(对于2.1也可能是相同的。因此,您可以使用该对象(Table2.SidColumn)而不是使用结构。
如果push推进 - 你可以使用字符串覆盖所有内容 - 所以在你的情况下你可以在Where()方法中使用“Table1.Sid”和“Table2.Sid”。
答案 1 :(得分:0)
我无法证实这一点,但问题可能只发生在文字上? (不确定您的示例代码是否就是为了简洁起见)
int table1SidColumnValue = 2;
int table3SidColumnValue = 1;
.Where(Table1.SidColumn).IsEqualTo(table1SidColumnValue)
.And(Table3.SidColumn).IsEqualTo(table2SidColumnValue)
我记得在使用带有文字值的多个.In()子句时遇到问题,但不确定这是否适用于您的问题。
答案 2 :(得分:0)
我不确定我的代码版本是什么,但您的查询为我生成了编号参数。
如果你看一下ANSISqlGenerator.cs的第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));
where参数确实应该附加数字......也许拉最新版本?