LINQ Expression AndAlso,OrElse和And,Or的區別


AndAlso和OrElse應該是vb。net引入的新運算符。
因為用vb。net的時間還不是很長,之前我一直以為他們和and,or根本沒有區別。

現在終於明白,他們之間還是有很大區別的:
AndAlso,OrElse相對於and,or最大的特性是會自動實現“最短路徑”。
所謂“最短路徑”就是指:當第一個被比較的運算式的結果已經能決定運算的最終結果時,就不會再去比較其他運算式,因此可以避免掉額外且不需要的比較運算式。

舉個很簡單的例子說明下:

 

Dim  a  As  Int16  =   1
Dim  b  As  Int16  =   2

' 用or的話,a=1,b=2都會被比較
If  a  =   1   Or  b  =   2   Then
  ' xxxxx
End   If

' 用OrElse的話,只比較了第一個條件a=1
If  a  =   1   OrElse  b  =   2   Then
  ' xxxx
End   If

 

 

 


當用or的時候,a=1和b=2這2個條件,都會被判斷。而用orelse,則當前面一個條件(a=1)已經能決定最終結果的話,程序就不會在判斷第二個條件(b=2)了。

類似的情況還有:

Dim  a  As  Int16  =   1
Dim  b  As  Int16  =   2

' 用and的話,a=999,b=2,(a + b) * (b - a) = 3 都會被比較
If  a  =   999   And  b  =   2   And  (a  +  b)  *  (b  -  a)  =   3   Then
  ' xxxxx
End   If

' 用AndAlso的話,只比較了第一個條件a=999,由於已經是false了,所以后面的運算式不再判斷
If  a  =   999   AndAlso  b  =   2   AndAlso  (a  +  b)  *  (b  -  a)  =   3   Then
  ' xxxx
End   If

 


當出現以上情況時,AndAlso和OrElse的效率要高於and,or。

所以,在大多數情況下,我們可以使用AndAlso和OrElse替換and,or,以提高運算效率。

 

 

EF生成的SQL語句對比:

OrElse會生成OR 

exec sp_executesql N'SELECT [b].[RowID], [b].[BusinessCode], [b].[BusinessDescription], [b].[IsActive], [b].[CreateUserName], [b].[CreateTime], [b].[UpdateUserName], [b].[UpdateTime]
FROM [base_Business] AS [b]
WHERE ([b].[BusinessCode] LIKE ''%01'') OR ([b].[BusinessCode] LIKE ''B%'')
ORDER BY [b].[BusinessCode]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=100

如果用Or,生成的語句為:

exec sp_executesql N'SELECT [b].[RowID], [b].[BusinessCode], [b].[BusinessDescription], [b].[IsActive], [b].[CreateUserName], [b].[CreateTime], [b].[UpdateUserName], [b].[UpdateTime]
FROM [base_Business] AS [b]
WHERE (CASE
    WHEN [b].[BusinessCode] LIKE ''%01'' THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END | CASE
    WHEN [b].[BusinessCode] LIKE ''B%'' THEN CAST(1 AS bit)
    ELSE CAST(0 AS bit)
END) = CAST(1 AS bit)
ORDER BY [b].[BusinessCode]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=100

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM