Subsonic 3 Simple Query内连接sql语法

时间:2009-07-29 08:59:06

标签: subsonic subsonic3

我想在两个表(BusinessUnit和UserBusinessUnit)上执行简单连接,因此我可以获得分配给给定用户的所有BusinessUnit的列表。

第一次尝试有效,但没有覆盖Select允许我限制返回的列(我从两个表中获取所有列):

var db = new KensDB();
SqlQuery query = db.Select
 .From<BusinessUnit>()
 .InnerJoin<UserBusinessUnit>( BusinessUnitTable.IdColumn, UserBusinessUnitTable.BusinessUnitIdColumn )
 .Where( BusinessUnitTable.RecordStatusColumn ).IsEqualTo( 1 )
 .And( UserBusinessUnitTable.UserIdColumn ).IsEqualTo( userId );

第二个参加者允许列名限制,但生成的sql包含多个表名(?)

SqlQuery query = new Select( new string[] { BusinessUnitTable.IdColumn, BusinessUnitTable.NameColumn } )
 .From<BusinessUnit>()
 .InnerJoin<UserBusinessUnit>( BusinessUnitTable.IdColumn, UserBusinessUnitTable.BusinessUnitIdColumn )
 .Where( BusinessUnitTable.RecordStatusColumn ).IsEqualTo( 1 )
 .And( UserBusinessUnitTable.UserIdColumn ).IsEqualTo( userId );

...可生产

SELECT [BusinessUnits].[Id], [BusinessUnits].[Name]
 FROM [BusinessUnits]
 INNER JOIN [UserBusinessUnits]
 ON [BusinessUnits].[Id] = [UserBusinessUnits].[BusinessUnitId]
 WHERE [BusinessUnits].[RecordStatus] = @0
 AND [UserBusinessUnits].[UserId] = @1

所以,有两个问题:
- 如何限制方法1中返回的列?
- 为什么方法2在生成的SQL中复数列名(我可以绕过它吗?)

我正在使用3.0.0.3 ...

2 个答案:

答案 0 :(得分:2)

到目前为止,我对3.0.0.3的体验表明,使用查询工具尚不可行,尽管版本为2。

我认为版本3的首选方法(到目前为止)是使用linq查询,例如:

var busUnits = from b in BusinessUnit.All()
join u in UserBusinessUnit.All() on b.Id equals u.BusinessUnitId
select b;

答案 1 :(得分:1)

我自己遇到了复数表名,但这是因为我只是在进行架构更改后重新运行一个模板。

一旦我重新运行了所有模板,复数表名就消失了。

尝试重新运行所有4个模板,看看是否能解决这个问题。