在C#中,&&
operator是短路的,所以如果第一個條件返回false,則根本不會執行第二個條件。從MSDN:
The conditional-AND operator (&&) performs a logical-AND of its bool operands, but only evaluates its second operand if necessary.
的||
operator的行爲以類似的方式,只是它不評估,如果第一個返回true的第二個參數。
雖然我不認爲這是完整的故事。我的帖子的其餘部分包括以下幾點:
- 您可以使用DataContext.Log記錄SQL語句。
- 無論您編寫哪種方式,您的查詢都不應該生成錯誤。
- LINQ到對象和LINQ to SQL之間的行爲有所不同。
- 您的過濾可能在本地而不是在數據庫中執行。
您可以輕鬆地在Visual Studio中查看生成的SQL,而不需要SQL事件探查器。您可以將鼠標懸停在LINQ to SQL查詢對象上,它將顯示SQL。或者你也可以使用DataContext.Log
記錄的SQL語句,比如像這樣:
TextWriter textWriter = new StringWriter();
using (var dc = new UserDataContext())
{
dc.Log = textWriter;
var userList = dc.Users;
var temp = (from a in userList
where (a.Name.ToString() == "john") && (a.Name != null)
select a).ToList();
}
string log = textWriter.ToString();
您也可以登錄到一個文件甚至Console.Out
:
dc.Log = Console.Out;
這樣做,你可以看到,查詢看起來像這樣,雖然你可能會有更多的列在選擇列表:
SELECT [t0].[Name]
FROM [dbo].[User] AS [t0]
WHERE ([t0].[Name] = @p0) AND ([t0].[Name] IS NOT NULL)
另一點是,您的查詢不應該產生一個錯誤。即使a.name
爲空,a == "john"
仍然可以工作 - 它只會返回false。
最後,C#的正常工作方式與LINQ to SQL的工作方式有所不同。你不應該從數據庫中得到一個空的異常。爲了證明這一點,我會做一個小的修改您的查詢 - 添加ToString
後a.Name
:
var temp = (from a in userList
where (a.Name.ToString() == "john") && (a.Name != null)
select a).ToList();
現在這個失敗對LINQ與一個NullReferenceException對象,但它與LINQ工作沒有拋出異常的SQL。所以我懷疑你已經把數據庫中的所有項目加載到內存中,並在本地進行過濾。換句話說,也許你有這樣的事情:
var userList = dc.Users.ToList();
,而不是這將使數據庫做過濾以下:
var userList = dc.Users;
所以我懷疑還有更多的這個問題比滿足眼。也許你可以提供更多的細節。
很好的回答 - 甜蜜和簡單的 – 2010-05-16 01:57:17
非常感謝...... – userb00 2010-05-16 01:59:37
@Preet僧伽:不再那麼短。仔細看看它,我不確定簡單的答案能夠充分解釋行爲。 – 2010-05-16 02:23:37