LINQ

2012-03-19 4 views
6

का उपयोग करके घंटे तक समूहित करना मेरे पास PowerStringHistorys और PowerCombinerHistorys तालिकाओं में हर 15 मिनट में डेटा रिकॉर्ड किया जा रहा है। मैं LINQ के लिए नया हूं और यह पता लगाने की कोशिश कर रहा हूं कि एक क्वेरी कैसे बनाएं जो प्रत्येक घंटे तक मेरे डेटा को समूहित करे और उस घंटे के लिए वर्तमान में औसत हो। यहाँ मैं अब तकLINQ

 TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
     DateTime UTC_StartingDate = TimeZoneInfo.ConvertTimeToUtc(StartingDate, easternZone); 
     DateTime UTC_EndingDate = TimeZoneInfo.ConvertTimeToUtc(EndingDate, easternZone); 

     var FirstQ = from p in db.PowerStringHistorys 
        join t in db.PowerStrings on p.string_id equals t.id 
        join u in db.PowerCombiners on t.combiner_id equals u.id 
        join s in db.PowerCombinerHistorys on p.recordTime equals s.recordTime 
        where p.recordTime >= UTC_StartingDate 
        where p.recordTime <= UTC_EndingDate 
        select new 
        { 
         Combiner = u.id, 
         Current = p.current, 
         RecordTime = p.recordTime, 
         Voltage = s.voltage 
        }; 

अब मैं combiner और घंटे के हिसाब से समूह की जरूरत है तो मैं मौजूदा औसत और दिनांक सीमा निर्दिष्ट के हर घंटे के लिए प्रत्येक combiner के लिए किलोवाट प्राप्त कर सकते हैं है। (प्रति घंटे औसत वाट)/1000 = किलोवाट

तो क्या मैं के साथ खत्म हो जाएगा नीचे की तरह कुछ है:

मैं क्वेरी किसी भी तरह इस सरल फार्मूला लागू करने की जरूरत है। किसी भी तरह की सहायता का स्वागत किया जाएगा।

Combiner 1  03/19/2012 1:0:0  1.85 Kwh 
Combiner 1  03/19/2012 2:0:0  1.98 Kwh 
Combiner 1  03/19/2012 3:0:0  2.05 Kwh 
Combiner 1  03/19/2012 4:0:0  2.11 Kwh 
Combiner 1  03/19/2012 5:0:0  2.01 Kwh 
Combiner 1  03/19/2012 6:0:0  1.96 Kwh 
Combiner 1  03/19/2012 7:0:0  1.85 Kwh 
Combiner 2  03/19/2012 1:0:0  1.77 Kwh 
Combiner 2  03/19/2012 2:0:0  1.96 Kwh 
Combiner 2  03/19/2012 3:0:0  2.03 Kwh 
Combiner 2  03/19/2012 4:0:0  2.11 Kwh 
Combiner 2  03/19/2012 5:0:0  2.02 Kwh 
Combiner 2  03/19/2012 6:0:0  1.98 Kwh 
Combiner 2  03/19/2012 7:0:0  1.83 Kwh 
Combiner 3  03/19/2012 1:0:0  1.77 Kwh 
Combiner 3  03/19/2012 2:0:0  1.96 Kwh 
Combiner 3  03/19/2012 3:0:0  2.03 Kwh 
Combiner 3  03/19/2012 4:0:0  2.11 Kwh 
Combiner 3  03/19/2012 5:0:0  2.02 Kwh 
Combiner 3  03/19/2012 6:0:0  1.98 Kwh 
Combiner 3  03/19/2012 7:0:0  1.83 Kwh 

संपादित

ऊपर अपने मूल प्रश्न था। मुझे प्राप्त दो सुझावों के साथ काम करने के बाद मैं नीचे प्रदर्शित कोड के साथ समाप्त हुआ। अभी मैं सिर्फ तारीखों और कुल Kwhs को देखने के लिए वापस कर रहा हूँ। मैं उपयोगकर्ता के लिए फ़िल्टर/सॉर्ट/समूह को फ़िल्टर करने के लिए टेलीरिक ग्रिड में प्रथम क्यू क्वेरी परिणाम देखने और फेंकने के लिए स्ट्रिंगग्रुप की सूची सूची को हाई चार्ट में फेंकने की योजना बना रहा हूं ताकि वे विवरण के साथ काम कर सकें। जबकि कोड काम करता है और परिणाम उत्पन्न करता है मैं उम्मीद कर रहा हूं, मुझे यकीन नहीं है कि यह कुशल है। चूंकि मुझे एक foreach का उपयोग करके चक्र करना है, मुझे अनुमान है कि एक बार यह बहुत अधिक डेटा प्राप्त हो जाने पर यह धीमा हो सकता है। क्या इसे संभालने का एक और अधिक प्रभावी तरीका है?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Mvc; 
using AESSmart.Models; 

namespace AESSmart.Controllers 
{ 
    public class StringKwh 
    { 
     public int CombinerID; 
     public int StringID; 
     public DateTime Interval; 
     public Double KWH; 

     public StringKwh(int combiner, int stringid, DateTime interval, double kwh) 
     { 
      CombinerID = combiner; 
      StringID = stringid; 
      Interval = interval; 
      KWH = kwh; 
     } 
    } 

    public class HomeController : Controller 
    { 
     private readonly AESSmartEntities db = new AESSmartEntities(); 

     public ActionResult Index() 
     { 
      //REPRESENTS DATE RANGE FOR A FULL DAY 
      DateTime startingDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 1); 
      DateTime endingDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59); 

      TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
      DateTime utcStartingDate = TimeZoneInfo.ConvertTimeToUtc(startingDate, easternZone); 
      DateTime utcEndingDate = TimeZoneInfo.ConvertTimeToUtc(endingDate, easternZone); 

      var firstQ = from p in db.PowerStringHistorys 
         from s in db.PowerCombinerHistorys 
         join t in db.PowerStrings on p.string_id equals t.id 
         join u in db.PowerCombiners on t.combiner_id equals u.id 
         where p.recordTime == s.recordTime 
         where p.recordTime >= utcStartingDate 
         where p.recordTime <= utcEndingDate 
         select new 
         { 
          Combiner = u.id, 
          StringId = p.string_id, 
          Current = p.current, 
          RecordTime = p.recordTime, 
          Voltage = s.voltage 
         }; 

      var groups = firstQ.ToList().GroupBy(q => new 
               { 
                q.Combiner, 
                q.StringId, 
                Date = q.RecordTime.Date, 
                Hour = q.RecordTime.Hour 
               }); 

      List<StringKwh> stringGroupedKwhlist = new List<StringKwh>(); 

      foreach (var group in groups) 
      { 
       stringGroupedKwhlist.Add(new StringKwh(
             group.Key.Combiner, 
             group.Key.StringId, 
             new DateTime(group.Key.Date.Year, group.Key.Date.Month, group.Key.Date.Day, group.Key.Hour, 0, 0), 
             group.Average(g => g.Voltage * g.Current)/1000d 
             )); 
      } 

      var groupCombiner = stringGroupedKwhlist.GroupBy(q => new { q.CombinerID }); 
      double myTotalKwh = 0; 

      foreach (var combinerGroup in groupCombiner) 
      { 
       myTotalKwh = Math.Round(combinerGroup.Sum(g => g.KWH), 3); 
      } 

      ViewBag.LifeTimeGeneration = myTotalKwh; 
      ViewBag.myUTCStartDate = utcStartingDate; 
      ViewBag.myUTCEndDate = utcEndingDate; 

      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 
    } 
} 

उत्तर

11

यह आप शुरू हो सकती है:

// Group by combiner ID, date, and hour 
var groups = FirstQ.ToList() 
    .GroupBy(q => new 
     { q.Combiner, Date = q.RecordTime.Date, Hour = q.RecordTime.Hour }); 

foreach (var group in groups) 
{ 
    var combinerId = group.Key.Combiner; 
    var interval = new DateTime(group.Key.Date.Year, group.Key.Date.Month, group.Key.Date.Day, group.Key.Hour, 0, 0); 

    // power = voltage * current 
    var kwh = group.Average(g => g.Voltage * g.Current)/1000d; 
} 
+0

प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में उल्लेख करना भूल गया था कि मुझे स्ट्रिंग स्तर से समूह करने की भी आवश्यकता है। तो मैंने इसे जोड़ा। मैं आपका समाधान काम करने में सक्षम था, हालांकि मुझे चिंता है। कृपया उपरोक्त मेरे संपादन की समीक्षा करें। – Linger

2

कोशिश की जगह इस प्रकार एक groupby के रूप में साथ select:

TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    DateTime UTC_StartingDate = TimeZoneInfo.ConvertTimeToUtc(StartingDate, easternZone); 
    DateTime UTC_EndingDate = TimeZoneInfo.ConvertTimeToUtc(EndingDate, easternZone); 

    var FirstQ = from p in db.PowerStringHistorys 
       join t in db.PowerStrings on p.string_id equals t.id 
       join u in db.PowerCombiners on t.combiner_id equals u.id 
       join s in db.PowerCombinerHistorys on p.recordTime equals s.recordTime 
       where p.recordTime >= UTC_StartingDate 
       where p.recordTime <= UTC_EndingDate 
       group new 
       { 
        Combiner = u.id, 
        Current = p.current, 
        RecordTime = p.recordTime, 
        Voltage = s.voltage 
       } 
       by new 
       { 
        Combiner = u.id, 
        Date = p.RecordTime.Date, 
        Hour = p.RecordTime.Hour 
       }; 
+0

आप एक ही घंटे पर अलग अलग दिनों पर इस, रीडिंग करते हैं एक साथ समूहीकृत किया जाएगा - आपको समूह में तारीख को भी काम करने की आवश्यकता होगी। साथ ही, मुझे यकीन नहीं है कि .हम सभी डेटा प्रदाताओं के लिए काम करेगा - यह SQL सर्वर पर पहुंचने पर हिचकी हो सकती है। प्रतिक्रिया के लिए –

+0

धन्यवाद। मैं आपका समाधान काम नहीं कर पा रहा था। यह नहीं जानता कि क्यू के साथ क्या करना है। मैं क्वेरी के भीतर किए गए सभी कामों को प्राप्त करने में सक्षम होना चाहता हूं। मुझे लगता है कि इसे संभालने का सबसे प्रभावी तरीका होगा। – Linger

+0

@ टोडडग्रोवर - मैंने इसे बहुत तेज़ी से लिखा - मैंने समूह को आपके कोड से लिया और इसे लैम्बडा वैरिएबल को बदले बिना 'फर्स्टक्यू' के अंत में जोड़ा। मैं वर्तमान में रेंज वैरिएबल से मेल खाने के लिए इसे अपडेट करूंगा। दुर्भाग्यवश, मुझे लगता है कि मैंने स्क्रॉल में शेष कोड को याद किया है, इसलिए यह आपके द्वारा अंतिम अनुमानों के शर्मिंदा होना बंद कर देगा; हालांकि, यह भी क्वेरी-निरंतरता (यानी 'कीवर्ड') और कुछ और क्वेरी-समझ वाक्यविन्यास के साथ पूरा किया जा सकता है। मैं कम से कम वाक्यविन्यास त्रुटियों से मुक्त होने के लिए अद्यतन करूँगा। – devgeezer

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

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