Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C将Datatable转换为嵌套列表/对象_C#_Linq_Ienumerable - Fatal编程技术网

C# 使用C将Datatable转换为嵌套列表/对象

C# 使用C将Datatable转换为嵌套列表/对象,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个这样的数据表。和数据模型 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;

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

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; }
    }
我想将其转换为列表类型的详细信息,如 列表详细信息列表;我试着这样做,但行在重复。 如果删除了详细信息,则会得到不同的结果,但由于匿名强制转换异常,无法将其转换为详细信息类型

 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();

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

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

下面的代码首先使用ID、名称、类型和术语对数据进行分组,然后在Select子句中创建新的详细信息对象


还有一点,如果Id本身是唯一的,那么您不需要按多个列进行分组,您只能按Id进行分组。

您需要选择您的详细信息,和GroupBy正确的分组元素。我也尝试过这样做,但它说不能隐式地将第x行上的system.collection.generic类型转换为system.generic.list。选择s=>new Faq{Question=s.FieldQUESTION,Answer=s.FieldANSWER}添加ToList以选择Faq。更新后,将填充FAQ的详细信息
 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();