我正在使用SelectMany
进行一些数据转换。它实质上是扁平化一些分层数据。问题是某些相关数据需要由缺少数据来表示。以下是我正在做的事情的一个例子:
var records = report.Persons.SelectMany(
person => person.Relatives.Select(relative => new FlattenedRecord
{
ReportNumber = report.ReportNumber,
ReportDate = report.ReportDate,
PersonAge = person.Age,
PersonSex = person.Sex,
PersonRace = person.Race,
RelativesAge = relative.Age,
RelativesSex = relative.Sex,
RelativesRace = relative.Race,
Relationship = relative.Relationship)
}));
这会产生一个类似于此的列表:
ReportNumber|ReportDate|PersonAge|PersonSex|PersonRace|RelativeAge|RelativeSex|RelativeRace|Relationship
1|2015-01-01| 25| M | W | 48 | F | W | Parent
1|2015-01-01| 25| M | W | 18 | M | W | Sibbling
1|2015-01-01| 25| M | W | 44 | M | W | Parent
1|2015-01-01| 14| F | B | 34 | F | B | Parent
1|2015-01-01| 16| M | B | 34 | F | B | Parent
1|2015-01-01| 8| M | B | 34 | F | B | Parent
需要发生的事情是,如果有多个人具有相同的亲属,或者如果一个人有多个亲属,则年龄,性别,种族和关系数据需要为后续行留空。例如:
ReportNumber|ReportDate|PersonAge|PersonSex|PersonRace|RelativeAge|RelativeSex|RelativeRace|Relationship
1|2015-01-01| 25| M | W | 48 | F | W | Parent
1|2015-01-01| | | | 18 | M | W | Sibbling
1|2015-01-01| | | | 44 | M | W | Parent
1|2015-01-01| 14| F | B | 34 | F | B | Parent
1|2015-01-01| 16| M | B | | | |
1|2015-01-01| 8| M | B | | | |
但是对于我的生活,我无法弄清楚如何做我需要做的事。
答案 0 :(得分:1)
Person lastPerson = null;
Relative lastRelative = null;
var records = report.Persons.SelectMany(
person => person.Relatives.Select(relative =>
{
FlattenedRecord r = new FlattenedRecord
{
ReportNumber = report.ReportNumber,
ReportDate = report.ReportDate,
PersonAge = lastPerson != person ? person.Age : "",
PersonSex = lastPerson != person ? person.Sex : "",
PersonRace = lastPerson != person ? person.Race : "",
RelativesAge = lastRelative != relative ? relative.Age : "",
RelativesSex = lastRelative != relative ? relative.Sex : "",
RelativesRace = lastRelative != relative ? relative.Race : "",
Relationship = lastRelative != relative ? relative.Relationship : ""
};
lastPerson = person;
lastRelative = relative;
return r;
}));
答案 1 :(得分:0)
如果你这样做会怎么样?
var records = report.Persons.SelectMany(
person => new FlattenedRecord
{
ReportNumber = report.ReportNumber,
PersonRace = person.Race,
RelativesAge = person.Relatives.Count() > 1 ? null : person.Relatives.First().Age
});