Subsonic:相同的列名称不同的表

时间:2009-06-01 03:05:35

标签: subsonic

我有一个查询,我需要在两个不同的表中为两个不同的列执行“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子句执行连接!

3 个答案:

答案 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参数确实应该附加数字......也许拉最新版本?