2010-08-10 35 views
0

我試圖使用SqlQuery類功能,下面的SQL轉換成亞音速語法:亞音速2.2 SqlQuery類與內部連接和在哪裏

SELECT DISTINCT * FROM FamilyMemberTeamRole FMTR 
INNER JOIN TeamRole TR ON FMTR.TeamRoleId = TR.TeamRoleId 
INNER JOIN Team T ON T.TeamId = TR.TeamId 
LEFT JOIN FamilyMemberClassHistory FMCH ON FMCH.FamilyMemberClassHistoryId = FMTR.FamilyMemberClassHistoryId 
LEFT JOIN CBSClass CG ON CG.CBSClassGroupId = FMCH.CBSClassGroupId 
LEFT JOIN CBSClassSession CS ON CG.CBSClassGroupId = CS.CBSClassGroupId 
AND (CS.ClassStartDate <= FMTR.EndDate or FMTR.EndDate IS NULL) 
AND (CS.IsHistory = 0 OR CS.IsHistory = NULL) 
WHERE FMTR.FamilyMemberId = @FamilyMemberId 

我想出了這個然而什麼是錯的我的最後一個左語法因爲我不知道如何將SqlQuery中的值與自己進行比較。

SqlQuery sql = new Select().From(FamilyMemberTeamRole.Schema.TableName) 
.InnerJoin(TeamRole.TeamRoleIdColumn, FamilyMemberTeamRole.TeamRoleIdColumn) 
.InnerJoin(Team.TeamIdColumn, TeamRole.TeamIdColumn) 
.LeftOuterJoin(FamilyMemberClassHistory.FamilyMemberClassHistoryIdColumn, FamilyMemberTeamRole.FamilyMemberClassHistoryIdColumn) 
.LeftOuterJoin(CBSClass.CBSClassGroupIdColumn, FamilyMemberClassHistory.CBSClassGroupIdColumn) 
.LeftOuterJoin(CBSClassSession.CBSClassGroupIdColumn, CBSClass.CBSClassGroupIdColumn) 
.AndExpression(CBSClassSession.Columns.ClassStartDate).IsLessThanOrEqualTo(FamilyMemberTeamRole.Columns.EndDate) 
.Or(FamilyMemberTeamRole.Columns.EndDate).IsNull().CloseExpression() 
.AndExpression(CBSClassSession.Columns.IsHistory).IsEqualTo(false) 
.Or(CBSClassSession.Columns.IsHistory).IsNull().CloseExpression() 
.Where(FamilyMemberTeamRole.Columns.FamilyMemberId).IsEqualTo(this.FamilyMemberId) 
.Distinct(); 

回答

1

您可以隨時查詢什麼亞音速你與BuildSqlStatement()方法生成:

SqlQuery query = DB.Select().From<Product>(); 
String output = query.BuildSqlStatemtent(); 

但我想我知道是什麼問題:SubSonic2加入方法不支持加入多列據我所知:subsonic 2 join on multiple columns

所以你基本上你有兩個選擇。

一)做一個 「逗號連接」

SELECT * FROM table1 
INNER JOIN table2 ON table1.id = table2.table1_id 

相同低於此查詢,但更易讀

SELECT * FROM table1, table2 
WHERE table1.id = table2.table1_id 

至少這是對MySQL

編輯真:贏得與亞音速工作,因爲我想出了我的問題(但已忘記)

http://www.mysqlperformanceblog.com/2010/04/14/is-there-a-performance-difference-between-join-and-where/

b)使用亞音速的後門來執行普通SQL的InlineQuery。

private class Process 
    { 
     public Int64 Id { get; set; } 
     public string User { get; set; } 
     public string Host { get; set; } 
     public string Db { get; set; } 
     public string Command { get; set; } 
     public string State { get; set; } 
     public string Info { get; set; } 
    } 

    var result = DB.Query().ExecuteTypedList<Process>("SHOW FULL PROCESSLIST"); 
+0

我試圖避免使用INLINE SQL,但是如果它是唯一的可能的話。看起來很奇怪,你不能在查詢中引用一個通用的SQL Where Where子句。我知道我的情況有點複雜,但一般來說比較基本的SQL。 – roadsunknown 2010-08-17 18:30:22