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)