我有这个亚音速查询:
Select.AllColumnsFrom<Data.Group>()
.Where(Data.Group.GroupIDColumn).IsNotEqualTo(m_sRootGroupID)
.AndExpression(Data.Group.Columns.OwnerPersonID).IsEqualTo(gUserID)
.OrExpression(Data.Group.Columns.OwnerPersonID).IsEqualTo(gUserContextID)
.AndExpression(Data.Group.Columns.IsCallList).IsEqualTo(true)
.CheckLogicalDelete().ExecuteTypedList<Groups>();
乍一看,似乎前一位开发人员误将AndExpression
误认为是And
。我知道AndExpression
将前面的陈述括在括号内。
如何将上述亚音速查询转换为SQL?
这就是我的想法:
SELECT *
FROM tblGroups
WHERE GroupID <> m_sRootGroupID
AND ( --first [AndExpression]
OwnerPersonID = `gUserID
OR ( -- [OrExpression]
OwnerPersonID = gUserContextID
AND ( -- second [AndExpression]
IsCallList = true
)
)
) -- first [AndExpression]
AND ISNULL(IsDeleted,0) = 0
如果没有..Expression
,<{1}}如何处理?
答案 0 :(得分:1)
要获取发出的sql,只需调用查询的ToString方法,该方法将调用BuildSqlStatement。
答案 1 :(得分:0)
正如@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)
这告诉我们在没有AndExpression
的情况下调用OrExpression
/ CloseExpression
,亚音,假设括号内的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
继续在括号内包含先前的语句,直到找到另一个{{1} (我们可以在第二个..Expression
上观察到。
在第一个AndExpression
之后添加其他And
/ Or
方法可以加强证明
使用不带
AndExpression
的{{1}}将在括号中封装前面的语句,直到调用另一个..Expression
为止。