2014-10-14 7 views
12

मैं इकाई की रूपरेखा 6.1 उपयोग कर रहा हूँ, और मैं इस तरह एक कोड है:विधि ढूंढें क्यों एक शीर्ष (2) क्वेरी उत्पन्न करता है?

Brand b; 
using(var ctx = new KokosEntities()) 
{ 
     try 
     { 
      b = ctx.Brands.Find(_brands[brandName].Id); 
      return b; 
     } 
     catch (Exception ex) 
     { 
      _logger.Log(LogLevel.Error, ex); 
     } 
} 

और यह उत्पन्न करता है:

N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[OpenCartId] AS [OpenCartId] 
FROM [dbo].[Brands] AS [Extent1] 
WHERE [Extent1].[Id] = @p0',N'@p0 int' 

Find विधि एक भी परिणाम देता है, लेकिन यह बजाय एक TOP(2) क्वेरी उत्पन्न करता है 1। क्यूं कर?

नोट: मुझे यकीन है कि मैं विधि में Id सही कर रहा हूं, और हाँ, Id प्राथमिक कुंजी है।

उत्तर

13

आप DbSet<TEntity>.Find Method के लिए दस्तावेज़ को देखें, तो:

दिया प्राथमिक कुंजी मूल्यों के साथ एक इकाई ढूँढता है।

मैं Find विधि के लिए स्रोत कोड पर एक नज़र लिया और पाया:

/// <exception cref="T:System.InvalidOperationException">Thrown if multiple entities exist in the context with the primary key values given.</exception><exception cref="T:System.InvalidOperationException">Thrown if the type of entity is not part of the data model for this context.</exception><exception cref="T:System.InvalidOperationException">Thrown if the types of the key values do not match the types of the key values for the entity type to be found.</exception><exception cref="T:System.InvalidOperationException">Thrown if the context has been disposed.</exception> 
    public virtual TEntity Find(params object[] keyValues) 
    { 
     return this.GetInternalSetWithCheck("Find").Find(keyValues); 
    } 

तो विधि, विभिन्न इकाइयों के मामले में InvalidOperationException फेंक देते हैं।

फेंक दिया है, जब अनेक संस्थाओं

दिया आंतरिक Find करने के लिए कॉल Single/SingleOrDefault में अनुवाद नहीं करता है प्राथमिक कुंजी मूल्यों के साथ संदर्भ में मौजूद हैं; इसके बजाय एकाधिक इकाइयों की जांच के लिए एक साधारण पाश का उपयोग किया जाता है।

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

+2

+1। –

9

मैं कवर के तहत अनुमान लगा रहा हूं जो Single कॉल या ऐसा कुछ दिखता है। उस स्थिति में, LINQ यह सुनिश्चित करना चाहता है कि केवल 1 परिणाम है। यदि 2 रिकॉर्ड लौटे हैं, तो यह फेंक सकता है।

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

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