【发布时间】:2015-04-09 10:59:13
【问题描述】:
我需要一些帮助来解决这个问题。 我正在尝试将我的数据表转换为分层子列表,然后使用 LINQ 转换为 json。下面的代码运行完美。
var result = rows
.GroupBy(x => new {b = x["Name"], a = x["Id"], c = x["MorningShift"], d = x["EveningShift"]})
.OrderBy(a => a.Key.b)
.Select(empl => new
{
Id = empl.Key.a,
Name = empl.Key.b,
MorningShift = empl.Key.c,
EveningShift = empl.Key.d,
Details = empl
.Select(z => new
{
RouteId=z["RouteId"],
ReportingHRName = z["ReportingHRName"],
ShiftType = z["ShiftType"]
})
.OrderBy(a => a.ReportingHRName)
});
员工可以上早班或晚班或两者兼有。我需要员工的详细信息作为子列表。我认为我的 LINQ 知识还不够好。我已经按 Name、Id、MorningShift、EveningShift 分组以使用该键检索这些列。
但是这样做,如果员工的早班为空,那么将有单独的列表 - 具有空值和不具有空值。 (当 GroupBy 完成时) 这是不希望的。
所以最后,我需要一些帮助来在不使用键的情况下检索列-morningshift 和 nightshift。
注意:如果我尝试这样做
EveningShift = x["EveningShift"],
MorningShift = x["MorningShift"]
那么我无法选择每个员工的 ReportingHRName 和 ShiftType 作为子列表。
我收到了类似的帖子 (Convert Hierarchical DataTable to Json)。但这无法回答我的问题。
编辑的数据表示例:
Id Name MorningShift EveningShift RouteID ReportingHRName ShiftType
1 abc 9 null 11 alex full time
2 def 8 null 12 robin part time
3 geh null 5 13 shek full time
4 def null 6 13 shek part time
JSON 列表示例
[{"Id":"1","Name":"abc","MorningShift":"9","EveningShift":"null","Details"[{"RouteId":"11","ReportingHRName":"alex","ShiftType":"full time"}]},{"Id":"2","Name":"def","MorningShift":"8","EveningShift":"6","Details":[{"RouteId":"12","ReportingHRName":"robin","ShiftType":"part time"}{"RouteId":"13","ReportingHRName":"shek","ShiftType":"full time"}]}{"Id":"3","Name":"geh","MorningShift":"null","EveningShift":"5","Details"[{"RouteId":"13","ReportingHRName":"shek","ShiftType":"full time"}]}]
因此,MorningShift 和 EveningShift 应该在没有 groupby 员工姓名(姓名)的情况下检索。但 RouteId、ReportingHRName 和 ShiftType 应按员工分组检索。
如果 MorningShift 和 EveningShift 是按上述代码中的键检索的,则每个 MorningShift 和 EveningShift 将有单独的详细信息。
希望您能理解这个问题。感谢您的回复。
这是我尝试使用以下答案的代码。
var groupedItems = dt.Rows.Cast<DataRow>()
.GroupBy(x => x["Name"])
.OrderBy(x => x["Name"])
.Select(x => new
{
Name = x["Name"],
MorningShift = x["MorningShift"]
EveningShift = x["MorningShift"],
Details = x.Select(y => new {RouteId=y["RouteId"],ReportingHRName=y["ReportingHRName"],ShiftType=y["ShiftType"]})
});.
但这会给我带来错误。无法在下面的代码中识别 Name、MorningShift 等。
Name = x["Name"],
MorningShift = x["MorningShift"]
【问题讨论】:
-
您能否提供您的数据表的简化示例和所需的 JSON 结果?
-
我不明白这里的层次结构在哪里......你在
Id上分组,我认为这是独一无二的。那么为什么Details是一个数组呢?由于Id,它将始终只有一个对象。 -
@AleksandrIvanov:非常感谢您指出这一点。我已经编辑了列表。对困惑感到抱歉。 :(
-
当您说 DataTable 时,您的意思是标准 DataTable?
-
是的@AleksandrIvanov
标签: c# json linq datatable group-by