将数据提取到数据表中以在一个图表上绘制多个图形

时间:2013-12-11 08:41:35

标签: c# sql database linq statistics

我正在开展一个旨在为统计目的提取和处理数据的项目。 假设我有许多元素“E”,每个元素都有一个字段列表{F1,F2,F3,...}。 我的主表如下所示:

enter image description here

我需要通过elementID将数据提取到数据表中,并将“Date”作为Key。

[{"key": "date1",
 "F1": "value",
 "F2": "value"}
,{"key": "date2",
 "F1": "value",
 "F2": "value"}
,{"key": "date3",
 "F1": "value",
 "F2": "value"}
,{....}]

我目前的实现是下一步:

1)按字段查询数据库,并在Dictionary<DateTime, double>

中按日期排序

2)检查并填写每个Dictionary中的缺失值。

3)循环浏览列表或按Dictionary按键并逐行填充DataRow

我不认为这是最终的解决方案,我一直在努力优化代码。但我不确定我应该关注哪一层。是否有任何可能的方法来使用select from database获取所需的结构(无需进一步循环)?

1 个答案:

答案 0 :(得分:0)

不是很清楚,但是,我假设您想要按DateTime的日期部分进行分组,并选择一个字典,其中此日期为关键字,值为List<double>

然后你根本不需要DataTable。而不是double我将使用具有所有属性的自定义类。假设mainTable已经是DataTable原始数据:

public class ElementMeasurement
{
    public Element Element { get; set; }
    public double Value { get; set; }
    public string Field { get; set; }
    public DateTime Date { get; set; }
}

public class Element
{
    public int ElementID { get; set; }
    public string Name { get; set; }
}

现在,您可以使用属于Enumerable.GroupBy的<{1}}:

System.Linq

编辑:“好吧,我应该让你知道它是一张有数千英里行的巨大桌子!”

我不知道桌子还没有在内存中。那么这可能太贵了。因此,DataReader上的循环可以产生按Date排序的行更有效。然后你仍然可以使用我上面的类来保持它的可读性和可维护性,但是逐步填充字典。

例如(假设SQL-Server):

Dictionary<DateTime, List<ElementMeasurement>> dateMeasurements = mainTable.AsEnumerable()
    .GroupBy(row => row.Field<DateTime>("Date").Date)
    .ToDictionary(g => 
        g.Key,
        g => g.Select(row => new ElementMeasurement
            {
                Element = new Element { ElementId = row.Field<int>("ElementId") },
                Field = row.Field<string>("Field"),
                Value = row.Field<double>("Value"),
                TimeOfMeasurement = row.Field<DateTime>("Date")
            }).ToList()
);