2013-03-22 10 views
10

द्वारा क्रमशः समूह के साथ लिंक क्वेरी और प्रासंगिक गुण CreationTime (दिनांक समय) और Reference (स्ट्रिंग) और कुछ अन्य मानों के साथ ऑब्जेक्ट्स हैं।इकाई फ्रेमवर्क -

मैं किसी दिए गए Reference

  • आदेश द्वारा एक DbContext कि

    • समूह मेरी Measurement वस्तुओं के लिए एक कुशल LINQ क्वेरी लिखने के लिए करना चाहते हैं समूह से या तो पहले Measurement की CreationTime संपत्ति द्वारा समूहों या CreationTime गुण
    • की औसत सबसे हाल ही में numOfEntries
    करने के लिए क्वेरी को सीमित करता है

    (बाद के चरण में मैं औसतन गणना इन लौटे समूहों पर मान है, लेकिन मुझे लगता है कि मेरी समस्या के लिए प्रासंगिक नहीं है लगता है।)

    DbContext ही सब Measurement वस्तुओं पकड़े एक DbSet<Measurement> बुलाया Measurements है।

    मैं निम्नलिखित क्वेरी के साथ आया, जिसके परिणामस्वरूप समूहों की एक सूची में सही तरीके से आदेश दिया गया है लेकिन इसमें कुछ समूह गायब हैं।

    var groupByReference = (from m in context.Measurements 
              orderby m.CreationTime 
              group m by new { m.Reference } into g 
              select g).Take(numOfEntries).ToList(); 
    

    मैं सही ढंग से Measurement एस के "सबसे हाल ही में" समूह कैसे चुनें?

    मैं एक MySQL डेटाबेस (MySQL कनेक्टर/नेट 6.6.4) के साथ इकाई फ्रेमवर्क 4.4 का उपयोग कर रहा हूं। यह उदाहरण सरलीकृत है, मैं अधिक जानकारी में जा सकता हूं और/या यदि आवश्यक हो तो एक उदाहरण दे सकता हूं।

    धन्यवाद!

  • +1

    के बजाय की गणना CreationTime की "औसत ", क्या आपने किसी दिए गए बिंदु से टाइमपैन की गणना करने और फिर उन टाइमपैनों का औसत निर्धारित करने के बाद दिए गए बिंदु और औसत समय के आधार पर परिणामस्वरूप तारीख की गणना की है? –

    उत्तर

    0

    order bygroup by के बाद जाने की कोशिश: बजाय

    var groupByReference = (from m in context.Measurements 
             group m by new { m.Reference } into g 
             order by g.Avg(i => i.CreationTime) 
             select g).Take(numOfEntries).ToList(); 
    
    +0

    मैंने कोशिश की, लेकिन एक त्रुटि मिली कि 'डेटटाइम' कैनोट को 'int' में परिवर्तित किया जा सकता है। मैंने परीक्षण उद्देश्यों के लिए 'int' प्रॉपर्टी के साथ भी प्रयास किया और माईस्क्लएक्सप्शन को "फील्ड सूची 'में" अज्ञात कॉलम' GroupBy1.K2 'जैसा कुछ कह रहा है। – zufallsfund

    9

    यह विधि वाक्य रचना (जो मैं पढ़ने में आसान लगता है) है, लेकिन यह कर सकते हैं यह

    अपडेट किया गया पोस्ट टिप्पणी

    उपयोग .FirstOrDefault().First()

    दिनांकों औसत के संबंध में, आप के रूप में मैं इस समय एक IDE के लिए प्राप्त करने में असमर्थ हूँ पल के लिए कि आदेश ड्रॉप करना पड़ सकता है

    var groupByReference = context.Measurements 
               .GroupBy(m => m.Reference) 
               .Select(g => new {Creation = g.FirstOrDefault().CreationTime, 
    //            Avg = g.Average(m => m.CreationTime.Ticks), 
                   Items = g }) 
               .OrderBy(x => x.Creation) 
    //       .ThenBy(x => x.Avg) 
               .Take(numOfEntries) 
               .ToList(); 
    
    +1

    आपके सुझाव के लिए धन्यवाद, लेकिन मुझे निर्धारित करने की कोशिश में 'NotSupportedException' नहीं मिला जी। फर्स्ट() क्योंकि 'जी' अंतिम क्वेरी ऑपरेशन नहीं है। 'CreationTime 'संपत्ति पर औसत करने का प्रयास विफल रहा क्योंकि यह' int' नहीं है। – zufallsfund

    +0

    मैंने अपना जवाब अपडेट कर लिया है, लेकिन जब तक मैं एक आईडीई – NinjaNye

    +0

    आपके प्रयास के लिए धन्यवाद नहीं देता, तब तक मैं औसत दिनांक समस्या को ठीक करने में सक्षम नहीं हूं। मैंने इस दौरान कोशिश की और एक 'टिक्स' संपत्ति भी जोड़ा जो क्रिएटटाइम को लंबे समय तक स्टोर करता है ताकि 'एवरेज()' को काम करना चाहिए। अब मुझे MySQL अपवाद मिल रहा है जो 'फ़ील्ड सूची' में "अज्ञात कॉलम 'Distinct1.Reference' कहां क्लॉज '(फर्स्टऑर्डडिफॉल्ट) या" अज्ञात कॉलम' GroupBy1.K2 'कहता है (औसत)। क्या एक MySQL कनेक्टर इस के लिए संभावित कारण बग है? (मुझे जिक्र करना चाहिए कि वास्तविक क्वेरी थोड़ा अधिक जटिल है, मैं सीधे डीबीसेट से पूछताछ नहीं करता लेकिन स्रोत के रूप में एक और क्वेरी का उपयोग करता हूं।) – zufallsfund

    0

    आपका आवश्यकताओं हर जगह हैं, लेकिन यह समाधान है

    समूह के लिए

    संदर्भ संपत्ति द्वारा: उनमें से मेरी समझ के लिए

    var refGroupQuery = (from m in context.Measurements 
          group m by m.Reference into refGroup 
          select refGroup); 
    

    अब आप कहते हैं कि तुम "सबसे हाल ही में numOfEntries" द्वारा परिणामों को सीमित करना चाहते हैं - मैं ले इसका मतलब यह है कि आप वापस आ माप को सीमित करना चाहते ...उस मामले में:

    var limitedQuery = from g in refGroupQuery 
            select new 
            { 
             Reference = g.Key, 
             RecentMeasurements = g.OrderByDescending(p => p.CreationTime).Take(numOfEntries) 
            } 
    

    पहले मापन निर्माण के समय से समूहों के आदेश करने के लिए (ध्यान दें कि आप माप आदेश चाहिए, यदि आप जल्द से जल्द CreationTime मूल्य चाहते हैं, substitue "g.CreationTime" के साथ "g.SomeProperty"):

    var refGroupsOrderedByFirstCreationTimeQuery = limitedQuery.OrderBy(lq => lq.RecentMeasurements.OrderBy(g => g.SomeProperty).First().CreationTime); 
    

    औसत CreationTime द्वारा समूहों के आदेश करने के लिए DATETIME, struct के Ticks संपत्ति का उपयोग करें:

    var refGroupsOrderedByAvgCreationTimeQuery = limitedQuery.OrderBy(lq => lq.RecentMeasurements.Average(g => g.CreationTime.Ticks)); 
    
    1

    आप GroupBy का परिणाम कास्ट करने के लिए कोशिश करते हैं और एक में ले जा सकते हैं n Enumerable पहले तो NinjaNye द्वारा प्रदान समाधान पर बाकी (इमारत

    var groupByReference = (from m in context.Measurements 
               .GroupBy(m => m.Reference) 
               .Take(numOfEntries).AsEnumerable() 
               .Select(g => new {Creation = g.FirstOrDefault().CreationTime, 
                  Avg = g.Average(m => m.CreationTime.Ticks), 
                   Items = g }) 
               .OrderBy(x => x.Creation) 
               .ThenBy(x => x.Avg) 
               .ToList() select m); 
    

    आपका एसक्यूएल क्वेरी समान लगेगा की प्रक्रिया (अपने इनपुट के आधार पर) इस

    SELECT TOP (3) [t1].[Reference] AS [Key] 
    FROM (
        SELECT [t0].[Reference] 
        FROM [Measurements] AS [t0] 
        GROUP BY [t0].[Reference] 
        ) AS [t1] 
    GO 
    
    -- Region Parameters 
    DECLARE @x1 NVarChar(1000) = 'Ref1' 
    -- EndRegion 
    SELECT [t0].[CreationTime], [t0].[Id], [t0].[Reference] 
    FROM [Measurements] AS [t0] 
    WHERE @x1 = [t0].[Reference] 
    GO 
    
    -- Region Parameters 
    DECLARE @x1 NVarChar(1000) = 'Ref2' 
    -- EndRegion 
    SELECT [t0].[CreationTime], [t0].[Id], [t0].[Reference] 
    FROM [Measurements] AS [t0] 
    WHERE @x1 = [t0].[Reference]