我有一个亚音速的查询:
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
,如何处理CloseExpression
?
发布于 2017-10-20 10:57:48
正如@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
,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
上观察到)。
在第一个And
/Or
之后添加额外的AndExpression
/AndExpression
方法加强了以下证明
使用
..Expression
的不使用CloseExpression
将前面的语句封装在括号中,直到调用另一个..Expression
为止。
发布于 2017-10-20 00:12:05
要获得发出的sql,只需调用查询的ToString方法,该方法将调用BuildSqlStatement。
https://stackoverflow.com/questions/46833733
复制相似问题