使用 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
中的所需列
下面的代码首先使用 ID
、Name
、Type
和 Terms
对数据进行分组,然后在 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分组。
我有一个这样的数据表。
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
下面的代码首先使用 ID
、Name
、Type
和 Terms
对数据进行分组,然后在 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分组。