C# 如果我使用'AndExpression'而不使用'CloseExpression'会发生什么`

C# 如果我使用'AndExpression'而不使用'CloseExpression'会发生什么`,c#,subsonic,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).IsEqua

我有一个亚音速的疑问:

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>();

如果没有CloseExpression,..expression是如何处理的?

要获取发出的sql,只需调用查询的ToString方法,该方法将调用BuildSqlStatement。

正如@MikeWalsh在他的文章中指出的那样,calling.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在其括号内包含.OrData.Group.Columns.OwnerPersonID.IsEqualToSomeContextID,这意味着..表达式将继续在括号内包含前面的语句,直到找到另一个..表达式,正如我们在第二个AndExpression上看到的那样

在第一个AndExpression之后添加附加的和/或方法加强了以下证明:

在不使用CloseExpression的情况下使用..表达式将把前面的语句封装在括号中,直到调用另一个..表达式为止


这并不能直接回答我的问题+1尽管如此,因为你为我的答案指明了正确的方向
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)
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)