2009-10-09 7 views
14

私はLinq to SQLを学習していますが、把握に問題があります。私は単純にLinqクエリでC#で単一の(ブール値)値を返そうとしています。Linqを使用して単一の値をSQLに戻す

新しいコメントが追加されたときに、記事の所有者に電子メール通知を送信するかどうかを確認します。私はLinqから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()は、が正確にまたはであり、最大での結果が1つしかない場合にのみ機能します。より多くの結果があってもFirst()FirstOrDefault()が機能します。

バリアントは、結果にレコードが含まれない場合の型のデフォルト値を返します。

+1

。 –

+0

今、レコードがまだ存在しない可能性がある(そして存在する)場合はどうなりますか?その3つのうち、どれがその状況で最善を尽くすでしょうか? – Mike

+0

正確に言えば、実際の解決策にはそれ以上のものが必要な場合がありますので、ジャスティンの答えを見てください。彼はおそらく、あなたが必要とするものを正確に得ました。 – Joey

1

ただ1つの結果が予想される場合は、SingleまたはSingleOrDefaultを使用してboolを取得してください。最初の結果が必要な場合は、FirstまたはFirstOrDefaultを使用できます。

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); 
ここで指定されたオプションのいずれかにご.DefaultIfEmpty(false)を変更し
関連する問題