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 AndExpression
And
/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.
Cela ne répond pas directement à ma question. +1 si bien que vous avez indiqué la bonne direction pour obtenir ma réponse –