首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我使用‘`AndExpression`’而不使用“`CloseExpression`”,会发生什么情况?

如果我使用‘`AndExpression`’而不使用“`CloseExpression`”,会发生什么情况?
EN

Stack Overflow用户
提问于 2017-10-19 15:38:27
回答 2查看 101关注 0票数 0

我有一个亚音速的查询:

代码语言:javascript
运行
复制
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?

我就是这么想的:

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-20 10:57:48

正如@MikeWalsh在其answer中所指出的那样,调用.ToString()显示了在转换为SQL时亚声速查询的样子。

因此,上述代码可以转换为:

代码语言:javascript
运行
复制
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)

编辑:

我也是这么认为。但是,在使用此亚声速查询时:

代码语言:javascript
运行
复制
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();

我得到了这个查询(格式化我的)

代码语言:javascript
运行
复制
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为止。

票数 0
EN

Stack Overflow用户

发布于 2017-10-20 00:12:05

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46833733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档