2009-10-09 73 views
14

我正在學習LINQ to SQL,我很難理解它。我試圖簡單地返回一個Linq查詢在C#中的單個(布爾)值。用Linq返回一個值到SQL

我想查看故事的所有者是否希望在添加新評論時發送電子郵件通知。我想包含Linq to SQL的方法返回一個布爾值。

public bool NotifyOnComment(string username){ 
     var notify = (from s in db.AccountSettings 
         where s.UserName == username 
         select s.NotifyOnComment).DefaultIfEmpty(false); 

     // clueless 
    } 

更新:

我做的,現在以下幾點:

var notify = (from s in db.AccountSettings 
         where s.UserName == username 
         select s.NotifyOnComment).SingleOrDefault(); 

     return (bool)notify; 

回答

29

LINQ的,默認情況下總是返回集合。如果您需要單個值,則可以應用.Single(),.SingleOrDefault().First().FirstOrDefault()方法。

他們做的事情略有不同。 Single()SingleOrDefault()只有在正好最多結果中有一條記錄時纔會起作用。即使有更多結果,First()FirstOrDefault()也可以工作。

*OrDefault()變體將返回該類型的默認值,以防結果中不包含記錄。

+1

更改.DefaultIfEmpty(false)來這裏指定的選項之一。 –

+0

現在如果有機會(並且會有)沒有記錄存在的話。在那種情況下,哪三個最好? – Mike

+0

準確地說,一個可行的解決方案可能需要的不僅僅是這些,所以請看下面的Justin的答案。他可能正是你需要的。 – Joey

9
var notify = (from s in db.AccountSettings 
       where s.UserName == username 
       select s.NotifyOnComment).DefaultIfEmpty(false).First(); 

//notify will either hold a bool or the AccountSettings object so 
return (!(notify == false)); // Thanks Nick. Amazing what you'll do in a hurry. 
+0

+1。其實你有一個工作解決方案與我形成鮮明對比:-) – Joey

+3

這是一個經典的C#Antipattern(http://stackoverflow.com/questions/1529604/c-antipatterns)應該返回(!(notify == false)); –

4
var notify = (from s in db.AccountSettings 
       where s.UserName == username 
       select s.NotifyOnComment).Count(); 

return Convert.ToBoolean(notify);