正如@MikeWalsh 在他的answer 中所指出的,调用.ToString() 显示了亚音速查询在转换为SQL 时的样子。
因此,上面的代码可以翻译成:
SELECT * --subsonic specifies all columns
FROM [dbo].[tblGroups]
WHERE [dbo].[tblGroups].[GroupID] <> @GroupID0
AND ([dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID1
)
OR ([dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID3
)
AND ([dbo].[tblGroups].[IsCallList] = @IsCallList5
)
AND ([dbo].[tblGroups].[IsDeleted] IS NULL OR [dbo].[tblGroups].[IsDeleted] = 0)
这告诉我们,在没有CloseExpression 的情况下调用AndExpression/OrExpression,subsonic 假定括号中的AND 语句中只有一个条件,因此:
.AndExpression(Data.Group.Columns.OwnerPersonID).IsEqualTo(gUserID)
被翻译成:
AND ([dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID1)
编辑:
我就是这么想的。但是,当使用这个亚音速查询时:
Select.AllColumnsFrom<Data.Group>()
.Where(Data.Group.GroupIDColumn).IsNotEqualTo(m_sRootGroupID)
.AndExpression(Data.Group.Columns.OwnerPersonID).IsEqualTo("someownerID")
.Or(Data.Group.Columns.OwnerPersonID).IsEqualTo("SomeContextID")
.AndExpression(Data.Group.Columns.IsCallList).IsEqualTo(true)
.CheckLogicalDelete().ToString();
我得到了这个查询(格式化我的):
SELECT <All columns>
FROM [dbo].[tblGroups]
WHERE [dbo].[tblGroups].[GroupID] <> @GroupID0
AND ( -- first [AndExpression]
[dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID1 --Data.Group.Columns.OwnerPersonID).IsEqualTo("someownerID")
OR [dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID2 --.Or(Data.Group.Columns.OwnerPersonID).IsEqualTo("SomeContextID")
) -- close for first [AndExpression]
AND ( -- second [AndExpression]
[dbo].[tblGroups].[IsCallList] = @IsCallList4
) -- close for second [AndExpression]
AND ([dbo].[tblGroups].[IsDeleted] IS NULL OR [dbo].[tblGroups].[IsDeleted] = 0)
如您所见,第一个AndExpression 在其括号内包含.Or(Data.Group.Columns.OwnerPersonID).IsEqualTo("SomeContextID"),这意味着..Expression 继续在括号内包含前面的语句,直到它找到另一个..Expression(正如我们可以在第二个AndExpression。
在第一个 AndExpression 之后添加额外的 And/Or 方法可以加强证明
使用不带CloseExpression 的..Expression 会将前面的语句封装在括号中,直到调用另一个..Expression。