【问题标题】:Convert Datatable to nested list/object using C#使用 C# 将 Datatable 转换为嵌套列表/对象
【发布时间】:2019-10-16 17:16:05
【问题描述】:

我有一个这样的数据表。 和数据模型为

public class Details
    {

        public String Id { get; set; }
        public String Type { get; set; }
        public String Name { get; set; }
        public String Terms { get; set; }
        public List<FAQ> Faqs { get; set; }
    }

    public class FAQ
    {
        public string Question { get; set; }
        public string Answer { get; set; }
    }

我想将其转换为列表类型的详细信息,例如 List&lt;Details&gt; detatilsList; 我试过这样,但行在重复。 如果我删除详细信息而不是得到不同的结果,但由于匿名转换异常而无法将其转换为详细信息类型

 var details = dt.AsEnumerable().GroupBy(x =>
                new Details //removing this detail gives distinct record as expected. But can not cast
                {
                    ID= x.Field<decimal>("ID"),
                    NAME = x.Field<string>("NAME"),
                    TYPE = x.Field<string>("TYPE"),
                    TERMS = x.Field<string>("TERMS")
                })
            .Select(x =>
                new
                {
                    x.Key.ID,
                    x.Key.NAME,
                    x.Key.TYPE,
                    x.Key.TERMS,
                    Faqs =
                    x.Select(
                        s => new Faq {Question = s.Field<string>("QUESTION"), Answer = s.Field<string>("ANSWER")})

                }).ToList();

如何修复它并将其转换为详细信息列表

【问题讨论】:

  • 你需要Select你的DetailsGroupBy正确的分组元素。

标签: c# linq ienumerable


【解决方案1】:

您可以按匿名对象对多个键进行分组,然后从DataTable中选择所需的列

下面的代码首先使用IDNameTypeTerms对数据进行分组,然后在Select子句中创建新的Details对象。

 var details = dt.AsEnumerable().GroupBy(x =>
            new
            {
                ID= x.Field<decimal>("ID"),
                NAME = x.Field<string>("NAME"),
                TYPE = x.Field<string>("TYPE"),
                TERMS = x.Field<string>("TERMS")
            })
        .Select(x =>
            new Details
            {
                x.Key.ID,
                x.Key.NAME,
                x.Key.TYPE,
                x.Key.TERMS,
                Faqs =
                x.Select(
                    s => new Faq {Question = s.Field<string>("QUESTION"), Answer = s.Field<string>("ANSWER")}).ToList()
            }).ToList();

另外一点,如果Id本身是唯一的,那么你不需要按多列分组,你可以只按ID分组。

【讨论】:

  • 我也试过这样,但它说不能隐式地将类型 system.collection.generic 转换为 system.generic.list 在这一行 x.Select( s => new Faq {Question = s .Field("QUESTION"), Answer = s.Field("ANSWER")})
  • 添加了ToList 以选择常见问题解答。随着更新的详细信息与常见问题解答将被填充
猜你喜欢
  • 2021-05-25
  • 2019-10-03
  • 1970-01-01
  • 2023-02-20
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
相关资源
最近更新 更多