使用 C# 将数据表转换为嵌套 list/object

Convert Datatable to nested list/object using C#

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

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<Details> detatilsList; 我试过这样,但行重复。 如果我删除 Details 而不是我得到不同的结果但由于匿名转换异常无法将其转换为 Details 类型

 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 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分组。