2017-10-19 2 views
0

J'ai cette requête subsonique:Ce qui se passe si j'utilise `` AndExpression` sans CloseExpression`

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

À première vue, il semble que le développeur précédent a confondu AndExpression pour And. Je sais que AndExpression enferme les instructions précédentes entre parenthèses.

Comment la requête subsonique ci-dessus est-elle traduite en SQL?

C'est ce que je pense:

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 

Comment le ..Expression s être manipulé s'il n'y a pas CloseExpression?

Répondre

0

Comme cela a été souligné par @MikeWalsh dans son answer, l'appel .ToString() montre à quoi ressemble la requête subsonique lorsqu'elle est traduite en SQL.

Ainsi, le code ci-dessus peut être traduit en:

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) 

Qui nous dit que l'appel AndExpression/OrExpression sans CloseExpression, subsonique suppose qu'il n'y a qu'une seule condition dans l'instruction AND entre parenthèses, ainsi:

.AndExpression(Data.Group.Columns.OwnerPersonID).IsEqualTo(gUserID)

est traduit en: AND ([dbo].[tblGroups].[OwnerPersonID] = @OwnerPersonID1)


EDIT:

C'est ce que je pensais. Cependant, lorsque vous utilisez cette requête subsonique:

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

Je suis arrivé cette requête (mise en forme le mien):

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) 

Comme vous pouvez le voir, la première AndExpression comprend .Or(Data.Group.Columns.OwnerPersonID).IsEqualTo("SomeContextID") dans ses parenthèses, ce qui implique que ..Expression 's continuent à inclure des instructions précédentes entre parenthèses jusqu'à ce qu'il trouve un autre ..Expression (comme nous pouvons le constater sur le second AndExpression

Ajout

après la première AndExpressionAnd/Or supplémentaires méthodes renforce la preuve que

En utilisant ..Expression « s sans CloseExpression symboliseront entre parenthèses précédentes déclarations jusqu'à ce qu'une autre ..Expression est appelée.

1

Pour obtenir le sql émis, il suffit d'appeler la méthode ToString de la requête, qui appellera BuildSqlStatement.

+0

Cela ne répond pas directement à ma question. +1 si bien que vous avez indiqué la bonne direction pour obtenir ma réponse –