2012-08-07 10 views
30

मैं EF4.0 उपयोग कर रहा हूँ, और मैं एक प्रश्न लिखा है:एसक्यूएल में सिंगलऑर्डिफॉल्ट परिणाम टॉप (2) क्यों?

var query = context.Post.Where(p => p.Id == postId).SingleOrDefault(); 

मैं इस क्वेरी से केवल एक पोस्ट की जरूरत है। मैंने सोचा था कि SingleOrDefault() "का चयन टॉप (1) ..." उत्पन्न होगा, लेकिन जब मैं एसक्यूएल प्रोफाइलर गौर, यह था:

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Title] AS [Title], 
[Extent1].[Slug] AS [Slug], 
[Extent1].[PubDate] AS [PubDate], 
[Extent1].[PostContent] AS [PostContent], 
[Extent1].[Author] AS [Author], 
[Extent1].[CommentEnabled] AS [CommentEnabled], 
[Extent1].[AttachmentId] AS [AttachmentId], 
[Extent1].[IsPublished] AS [IsPublished], 
[Extent1].[Hits] AS [Hits], 
[Extent1].[CategoryId] AS [CategoryId] 
FROM [dbo].[Post] AS [Extent1] 
WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='ECD9F3BE-3CA9-462E-AE79-2B28C8A16E32' 

मैं चयन टॉप (2) में क्यों एफई परिणाम? मुझे केवल एक पोस्ट की जरूरत है।

+2

और आप इस्तेमाल कर सकते हैं: 'वर क्वेरी = context.Post.SingleOrDefault (पी => p.Id == postid);' – Malmi

+0

हम NHibernate, जो मैं यह करने के लिए उम्मीद का उपयोग कर रहे हैं, लेकिन यह नहीं है ... यह सब कुछ चुनता है ... Grrrrr ... –

उत्तर

48

यह शीर्ष 2 का चयन करता है ताकि यदि डेटाबेस में वास्तव में 2 या 2 से अधिक रिकॉर्ड हैं, तो एक अपवाद फेंक दिया जाएगा। अगर यह केवल शीर्ष 1 का चयन करता है तो त्रुटि करने का कोई तरीका नहीं होगा।

17

एक दृश्य की SingleOrDefault के लिए पूछ करके, आप इस व्यवहार के लिए पूछ रहे हैं:

  • यदि अनुक्रम बिल्कुल 0 तत्व है, default लौट अनुक्रम के तत्व प्रकार
  • के लिए करता है, तो अनुक्रम वास्तव में है 1 तत्व, तत्व
  • लौट यदि अनुक्रम से अधिक 1 तत्व है, फेंक

TOP (1) करना इस के पहले दो हिस्सों को सशक्त करेगा, लेकिन तीसरा नहीं। केवल TOP (2) करके हम 1 रिकॉर्ड और 1 रिकॉर्ड से अधिक अंतर कर सकते हैं।

यदि आप नहीं चाहते हैं या उपर्युक्त व्यवहार के तीसरे भाग की आवश्यकता है, तो FirstOrDefault का उपयोग करें।

संबंधित मुद्दे