2013-04-12 30 views
0

使用實體框架查詢數據時,以下哪項防禦檢查更可取?使用實體框架查詢數據時,哪個防禦檢查更可取?

1. null檢查:

user = users.SingleOrDefault(u => u.Email.Equals(email)); 

if(user == null) 
{ 
    throw new Exception("Some critical error!"); 
} 

OperationsOnUser(user); 

2. LINQ的Any()

if(users.Any(u => u.Email.Equals(email))) 
{ 
    user = users.Single(u => u.Email.Equals(email)); 
} 
else 
{ 
    throw new Exception("Some critical error!"); 
} 

OperationsOnUser(user); 

我個人使用第二個選項,因爲它感覺吸塵器給我,但我不是執行兩個數據庫調用而不是一個?我不確定實體框架的內在機制。

+0

如果*有*是一個用戶,那麼可能只需與'users.Single(u => ...)'一起去,如果一個序列中有多個元素,就會彈出「InvalidOperationException」 ? –

+0

第二個,如果在兩個數據庫調用之間刪除'user'記錄會發生什麼? – AakashM

回答

2

I will quote Jon Skeet:

我總是提醒 人實現LINQ般的操作來只迭代任何 輸入序列一次。有幾個序列是不可能迭代多次的,或者可能給每個 時間帶來不同的結果。這是個壞消息。

保持習慣只迭代一次。

對於你的例子,是的,你正在訪問數據庫的兩倍,這不是一個好主意。
事實上,你的第二個選項比第一個選項更讓我感覺更加混亂。你需要重新校準你的雜亂檢測器! :)

+0

感謝您的參考 - 所有冰雹Skeet。這對我來說很麻煩的原因是因爲使用了'null'。 'null'沒有具體的語義含義,所以我儘量避免它,但我需要在這裏小心:) – davenewza

+0

@davenewza不知道你的反''null'的位置,但如果你喜歡,你可以'Where '和'ToList',然後檢查結果列表的計數;大概如果這個列表有0個足夠有意義的成員? – AakashM

1

AakashM的評論是正確的。但是爲了擴大這一點,(1)更好,因爲你正在對數據庫進行單一操作,而在第二個例子中,你正在做兩次。一次看到它在那裏,一次用它。我認爲從我的角度來看,答案是不言而喻的。