2009-10-09 10 views
14

के साथ एक एकल मान लौट रहा है मैं लिंक से SQL सीख रहा हूं और मुझे इसे समझने में परेशानी हो रही है। मैं एक लिंक क्वेरी के साथ सी # में केवल एक (बूलियन) मान वापस करने की कोशिश कर रहा हूं।लिंक से SQL

मैं देखना चाहता हूं कि किसी कहानी के मालिक को नई टिप्पणियां जोड़ने पर ईमेल सूचना भेजी जाती है या नहीं। मुझे वह विधि चाहिए जिसमें बूलियन मान को वापस करने के लिए लिंक से 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 (गलत) बदलें। –

+0

अब क्या होगा यदि कोई मौका है (और वहां होगा) कि अभी तक कोई रिकॉर्ड मौजूद नहीं है। उस स्थिति में से कौन सा तीन सबसे अच्छा होगा? – Mike

+0

सटीक होने के लिए, एक कार्य समाधान को उससे अधिक की आवश्यकता हो सकती है, इसलिए जस्टिन के उत्तर के नीचे देखें। वह शायद आपको वही मिला जो आपको चाहिए। – Joey

1

यदि आप केवल एक परिणाम की अपेक्षा करते हैं तो बस प्राप्त करने के लिए Single या SingleOrDefault का उपयोग करें। यदि आप पहले परिणाम चाहते हैं तो आप 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

यह क्लासिक सी # एंटीपाटरर्न (http://stackoverflow.com/questions/1529604/c-antipatterns) वापस होना चाहिए (! (सूचित करें == झूठा)); –

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

return Convert.ToBoolean(notify); 
संबंधित मुद्दे