使用实体框架核心进行表拆分。将表格展平至主要细节

时间:2018-11-28 13:07:06

标签: c# asp.net .net database entity-framework

我想将此展平表放在类级别的主从层次结构中

| Type | DateTime   | Value |
-----------------------------
| 4711 | 2018-01-01 |  0.7  |
| 4711 | 2018-01-02 |  0.8  |
| 4711 | 2018-01-03 |  0.9  |
| 4711 | 2018-01-04 |  1.0  |
| 4712 | 2018-01-01 |  3.2  |
| 4712 | 2018-01-02 |  2.7  |
| 4712 | 2018-01-03 |  5.6  |
| 4712 | 2018-01-04 |  1.9  |

类结构

[Table("TypeValues")]
public class TypeMaster
{
    [Column("Type")]
    public int Type { get; set; }

    [ForeignKey("Type")]
    public virtual ICollection<TypeValue> Values { get; set; }
}

[Table("TypeValues")]
public class TypeValue
{
    [Column("DateTime")]
    public DateTime TimeStamp { get; set; }

    [Column("Value")]
    public float? Value { get; set; }

    public TypeMaster Index { get; set; }
}

我已经尝试过根据类型和日期时间在组合键之间进行多种变体,但是每次都有新的挑战使我无法完成此简单任务。我不知道了。

最后,我不想像类型那样有多余的数据。我希望按该类型对数据进行分组。

{
  "Result": [
    {
      "Type": "4711",
      "Values": [
        {
          "TimeStamp": "2018-01-01",
          "Value": "0.7"
        },
        {
          "TimeStamp": "2018-01-02",
          "Value": "0.8"
        },
        {
          "TimeStamp": "2018-01-03",
          "Value": "0.9"
        },
        {
          "TimeStamp": "2018-01-04",
          "Value": "1.0"
        }
      ]
    },
    {
      "Type": "4712",
      "Values": [
        {
          "TimeStamp": "2018-01-01",
          "Value": "3.2"
        },
        {
          "TimeStamp": "2018-01-02",
          "Value": "2.7"
        },
        {
          "TimeStamp": "2018-01-03",
          "Value": "5.6"
        },
        {
          "TimeStamp": "2018-01-04",
          "Value": "1.9"
        }
      ]
    }
  ]
}

更新

明确说明。我需要一个可以将IQueryable转发到以下服务的解决方案。解决方案是不手动对数据进行分组,而使用List <>进行处理。

所以我需要在模型级别解决这个问题。

1 个答案:

答案 0 :(得分:-1)

此代码可以工作吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication86
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Type", typeof(int));
            dt.Columns.Add("DateTime", typeof(DateTime));
            dt.Columns.Add("Value", typeof(float));

            dt.Rows.Add(new object[] {4711, DateTime.Parse("2018-01-01"), 0.7 });
            dt.Rows.Add(new object[] {4711, DateTime.Parse("2018-01-02"), 0.8 });
            dt.Rows.Add(new object[] {4711, DateTime.Parse("2018-01-03"), 0.9 });
            dt.Rows.Add(new object[] {4711, DateTime.Parse("2018-01-04"), 1.0 });
            dt.Rows.Add(new object[] {4712, DateTime.Parse("2018-01-01"), 3.2 });
            dt.Rows.Add(new object[] {4712, DateTime.Parse("2018-01-02"), 2.7 });
            dt.Rows.Add(new object[] {4712, DateTime.Parse("2018-01-03"), 5.6 });
            dt.Rows.Add(new object[] {4712, DateTime.Parse("2018-01-04"), 1.9 });

            var groups = dt.AsEnumerable().GroupBy(x => x.Field<int>("Type")).ToList();

            List<TypeMaster> data = (from g in groups
                                     select new { grp = new TypeMaster() { Type = g.Key }, rows = g })
                       .Select(x => new TypeMaster() {
                           Type = x.grp.Type,
                           Values = x.grp.Values = x.rows.Select(y => new TypeValue() {
                                   TimeStamp = y.Field<DateTime>("DateTime"),
                                   Value = y.Field<float>("Value"),
                                   Index = x.grp
                               }).ToList()
                       }).ToList();


         }

    }

    [Table("TypeValues")]
    public class TypeMaster
    {
        [Column("Type")]
        public int Type { get; set; }

        [ForeignKey("Type")]
        public virtual ICollection<TypeValue> Values { get; set; }
    }

    [Table("TypeValues")]
    public class TypeValue
    {
        [Column("DateTime")]
        public DateTime TimeStamp { get; set; }

        [Column("Value")]
        public float? Value { get; set; }

        public TypeMaster Index { get; set; }
    }




}
相关问题