如果我使用没有`CloseExpression`的`AndExpression`会发生什么

时间:2017-10-19 15:38:28

标签: c# subsonic

我有这个亚音速查询:

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}}如何处理?

2 个答案:

答案 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为止。