【问题标题】:Subsonic : Same column name different tables亚音速:相同的列名不同的表
【发布时间】:2010-10-30 07:47:40
【问题描述】:

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

请注意,在最后两行中,它对 Table1 和 Table3 都使用了 @Sid。我该怎么做才能使用@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 个 where 子句为 2 个不同的表执行连接!

【问题讨论】:

    标签: subsonic


    【解决方案1】:

    你用的是什么版本?在 2.2 中,您可以使用 TableColumn 对象来解决这个问题(2.1 也可能相同。因此,您可以使用对象 (Table2.SidColumn) 而不是使用结构,就像您正在做的那样。

    如果迫在眉睫 - 您可以使用字符串覆盖所有内容 - 因此在您的情况下,您可以在 Where() 方法中使用“Table1.Sid”和“Table2.Sid”。

    【讨论】:

    【解决方案2】:

    我无法确认这一点,但问题可能只发生在文字上? (为了简洁起见,不确定您的示例代码是否像那样)

    int table1SidColumnValue = 2;
    int table3SidColumnValue = 1;
    
    .Where(Table1.SidColumn).IsEqualTo(table1SidColumnValue)
    .And(Table3.SidColumn).IsEqualTo(table2SidColumnValue)
    

    我记得在使用多个带有文字值的 .In() 子句时看到了一个问题,但不确定这是否适用于您的问题。

    【讨论】:

      【解决方案3】:

      我不确定我有什么版本的代码,但您的查询会为我生成带编号的参数。

      如果您查看 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 参数确实应该附加数字...也许拉最新版本?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-12
        • 2012-03-02
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        相关资源
        最近更新 更多