2011-06-01 68 views
2

我有以下的LINQ到SQL語句:Linq-to-SQL導致問題的三元運算符?

return db.Photos.SingleOrDefault(p => p.PhotoID == id 
               && includePending ? true : p.Live); 

對於includePending我傳遞錯誤的。在數據庫中,「Live」對於除2張照片以外的所有照片都是正確的。

然而,不是像預期的那樣返回一張照片,而是返回除2之外的數據庫中的所有照片! PhotoID是主鍵(因此對於一個項目只能是true)和布爾邏輯表明FALSE AND TRUE = FALSE。那麼這裏發生了什麼?爲什麼它忽略我查詢中的p.PhotoID == id部分?

回答

10

我不記得full precedence rules的心臟,但你的條件等價於:

p => (p.PhotoID == id && includePending) ? true : p.Live 

,而你想要的:

p => p.PhotoID == id && (includePending ? true : p.Live) 

只需使用後一種形式,使之明確,或甚至改變它不使用條件:

p => p.PhotoID == id && (includePending || p.Live) 

我認爲是更簡單。我建議在這種情況下,即使優先規則對你有利,也可以使用包圍使邏輯更清晰。

你甚至可以使用兩個where子句:

.Where(p => p.PhotoID == id) 
.Where(p => includePending || p.live) 

甚至conditionalise第二:

var query = ... 
       .Where(p => p.PhotoID == id); 

if (!includePending) 
{ 
    query = query.Where(p => p.live); 
} 
+0

+1。只是包括這個優先列表供參考:http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – 2011-06-01 07:29:12

+0

@Mitch:是的。儘管如此,我仍然懶得學習它,對於這樣的相對罕見的事情 - 我寧願將它明確地*任一方式。 – 2011-06-01 07:30:10

+0

是的。具有明確意圖的代碼總是贏得我..... – 2011-06-01 07:32:04