【问题标题】:How to convert datatable record into custom Class?如何将数据表记录转换为自定义类?
【发布时间】:2013-09-23 15:51:15
【问题描述】:

我有以下记录的数据表

Columns -> A B C D E 
Rows->     1 2 3 X Y
           1 2 3 P Q

我希望将此数据表转换为我的自定义列表,如下所示

MyClass
{
int A
int B
int C
List<ChildClass>
}

ChildClass
{
String D
String E
}

我正在使用以下代码来制作它,但我在子类之间陷入了困境。请帮忙?

IList<MyClass> items = dt.AsEnumerable().Select(row => 
    new MyClass
        {
            A= row.Field<int>("A"),
            B= row.Field<int>("B"),
            C= row.Field<int>("C"),
        }).ToList();

【问题讨论】:

  • 我不太符合逻辑。为什么孩子班需要D&E?如果你确实需要它们,为什么需要一个列表?
  • 在我的实际应用程序中,MyClass 是我的自定义性能类别,而子类是关联的 CustomCounters。所以因为一个类别可以有多个计数器,因此我需要子类列表。同样会有多个类别。 A、B、C 字段是决定新 MyClass 的唯一因素,这意味着如果 A、B、C 在数据表中具有相同的值,则相应的 D、E 列值应该带有另一个子列表。我希望我现在清楚了吗?
  • 我认为您的数据库未正确规范化。您应该考虑将 A、B、C 分组分解为自己的表。 (如果您不确定我的意思,请查看“数据库规范化”)
  • 您的自定义列表代码无效。在MyClass 中,您有一个类型为List&lt;ChildClass&gt; 的字段,该字段没有名称。另外请澄清您的预期输出,鉴于提供的输入,您是否期望一个 MyClass 列表中包含 2 个 ChildClass?

标签: c# .net linq list


【解决方案1】:
 xyz.Select(row=> new Class1
                 {
                     A = row.Field<int>("A"),
                     B = row.Field<int>("B"),
                     C = row.Field<int>("C"),
                     list = xyz.Select(row1=> new ChildClass
                 {
                     D = row1.Field<int>("D"),
                     E = row1.Field<int>("E")
                 }).ToList()
                 });

假设您有一个 xyz 数据列表。试试这个吧。

【讨论】:

    【解决方案2】:

    您应该使用GroupBy。类似于以下内容。

    IList<MyClass> items = dt.AsEnumerable().GroupBy(
        row =>
            new
            {
                A = row.Field<int>("A"),
                B = row.Field<int>("B"),
                C = row.Field<int>("C"),
            },
        (key, values) =>
            new MyClass
            {
                A = key.A,
                B = key.B,
                C = key.C,
                Children = values.Select(row =>
                    new ChildClass
                    {
                        D = row.Field<string>("D"),
                        E = row.Field<string>("E"),
                    }).ToList()
            }).ToList();
    

    在您的示例中,这将产生一个 MyClass 对象(属性值为 1、2、3),其中包含两个 ChildClass 对象(分别具有属性值 X、Y 和 P、Q)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多