亚音速2加入多列

时间:2010-05-06 09:38:09

标签: mysql join subsonic

我想将以下声明转移到SubSonic 2.2

    SELECT b.*
    FROM tableA a
      INNER JOIN tableB b
        ON (a.year = b.year AND a.month = b.monath AND a.userid = b.userid);

我的问题是SubSonic的SqlQuery.LeftInnerJoin()命令没有重载,需要多个列。

由于任何连接只能使用where子句重写,我在我的sql中执行了以下操作:

    SELECT b.*
    FROM tableA a, tableB b
    WHERE a.year = b.year
      AND a.month = b.month
      AND a.userid = b.userid

应该提供相同的结果(事实上,至少对于mysql,这些语句之间在逻辑上绝对没有区别)。

但我也陷入了将其转移到亚音速的问题,因为“IsEqualTo(...)”成员非常聪明,可以确定我的参数是一个字符串并将其放入引号中。

DB.Select("TableB.*")
  .From<TableA>()
  .From<TableB>()
  .Where(TableA.YearColumn).IsEqualTo("TableB.Year")
  .And(TableA.MonthColumn).IsEqualTo("TableB.Month")
  .And(TableA.UseridColumn).IsEqualTo("TableB.UserId")

(我尝试了设置IsEqualTo参数的不同方法)

IsEqualTo(TableB.YearColumn)
IsEqualTo(TableB.YearColumn.QualifiedName)

参数被解释为

TableA.Year = 'TableB.Year'

或者我得到一个SqlQueryException。

有人可以告诉我如何使用亚音速执行此查询(第一个 - 使用JOIN还是第二个)?感谢

1 个答案:

答案 0 :(得分:1)

使用开箱即用的SubSonic 2,你不能。

这就是说,你有以下选择:

扩展SubSonic

如果您已经熟悉SubSonic,可以考虑向SubSonic本身添加多列连接。

使用视图,存储过程,表函数

如果您不想使用SubSonics代码,请在sql server中使用视图,存储过程和/或表函数。 SubSonic可以轻松访问视图和存储过程中的数据。

使用InlineQuery

InlineQuery允许你执行任何sql - 如果它是你的代码中只有sql的选项。

使用InlineQuery进行丑陋的解决方法

如果您绝对想要使用SubSonic创建查询,可以试试这个:

SqlQuery q = DB.Select()
  .From<TableA>()
  .CrossJoin<TableB>()
  .Where(TableA.YearColumn).IsEqualTo(0)
  .And(TableA.MonthColumn).IsEqualTo(0)
  .And(TableA.UseridColumn).IsEqualTo(0);

构建SQL语句,并替换参数名称:

string s = q.BuildSqlStatement();
s = s.Replace(q.Constraints[0].ParameterName, TableB.YearColumn.QualifiedName);
s = s.Replace(q.Constraints[1].ParameterName, TableB.MonthColumn.QualifiedName);
s = s.Replace(q.Constraints[2].ParameterName, TableB.UserIdColumn.QualifiedName);

然后使用带有InlineQuery的s。