का उपयोग करके घंटे तक समूहित करना मेरे पास 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();
}
}
}
प्रतिक्रिया के लिए धन्यवाद। मैं वास्तव में उल्लेख करना भूल गया था कि मुझे स्ट्रिंग स्तर से समूह करने की भी आवश्यकता है। तो मैंने इसे जोड़ा। मैं आपका समाधान काम करने में सक्षम था, हालांकि मुझे चिंता है। कृपया उपरोक्त मेरे संपादन की समीक्षा करें। – Linger