我想将以下声明转移到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还是第二个)?感谢
答案 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。