【发布时间】:2017-04-06 00:00:37
【问题描述】:
考虑以下linq查询
var result = from a in
from b in filledTable
join c in distinctList on b[0].SerialNumber equals c.Field("SERIAL NUMBER")
select new { b, c }
group a by new { a.b[0].SerialNumber } into d
select new
{
Id = d.Select(x => x.b[0].Id),
SerialNumber = d.Select(x => x.b[0].SerialNumber),
// This part is not producing the correct output.
ImportTable = d.Select(w => w.c.Table
.AsEnumerable()
.GroupBy(y => y.Field("SERIAL NUMBER"))
.Select(z => z.First())
.CopyToDataTable())
};
filledTable 在我的 linq 查询中是 List<dynamic>,它由从 sproc 返回的值填充,distinctList 是 List<DataRow>,我将来自 DataTable 的值区分为如下:
List<DataRow> distinctList = dt.AsEnumerable().Distinct(DataRowComparer.Default).ToList();
我的Linq 查询产生以下JSON
[
{
"FilledTableList":[
[
{
"Id":[
2
],
"SerialNumber":[
"1073410"
],
"ImportTable":[
[
{
"SERIAL NUMBER":"1073410",
"PRODUCT TYPE":"Product A"
},
{
"SERIAL NUMBER":"1073411",
"PRODUCT TYPE":"Product B"
}
]
]
},
{
"Id":[
-1
],
"SerialNumber":[
"1073411"
],
"ImportTable":[
[
{
"SERIAL NUMBER":"1073410",
"PRODUCT TYPE":"Proeduct A"
},
{
"SERIAL NUMBER":"1073411",
"PRODUCT TYPE":"Product B"
}
]
]
}
]
]
}]
但我想要以下JSON 输出
[
{
"FilledTableList":[
[
{
"Id":[
2
],
"SerialNumber":[
"1073410"
],
"ImportTable":[
[
{
"SERIAL NUMBER":"1073410",
"PRODUCT TYPE":"Product A"
}
]
]
},
{
"Id":[
-1
],
"SerialNumber":[
"1073411"
],
"ImporTable":[
[
{
"SERIAL NUMBER":"1073411",
"PRODUCT TYPE":"Product B"
}
]
]
}
]
]
}]
所以ImportTable节点只包含与上面FilleTabledList节点中的序列号匹配的信息。除此之外,其他一切似乎都按Linq 查询的预期工作。谁能告诉我哪里出错了
更新:
我的filledTable 包含以下两项:
{ Id = 2, SerialNumber = "1073410"}
{ Id = -1, SerialNumber = "1073411"}
最终我将在列表中包含更多项目,但为了弄清楚为什么更多 linq 查询不起作用,我将其范围缩小到仅项目
【问题讨论】:
-
所以你想要 return public List
- > FilledTableList { get;放; }?这是您尝试返回的内容。您的 JSON 仍然不正确。
-
@mww 是的,如果可能的话
-
很难重现您的问题,因为您没有提供任何源数据。您能否为您希望从中生成输出的填充表(4 - 10 个元素)填写一些源数据(我认为 distinctList 仅包含一个序列号为 1073411 的元素)?
-
@Oliver 我的
DataTable中的初始值由我手动组成的 4 个序列组成,分别由 1073410*、**1073410、1073411, 1073410 所以当我使用dt.AsEnumerable().Distinct(DataRowComparer.Default).ToList();来获取不同的值时,我会得到两个元素,它们分别是 1073410 和 1073411跨度> -
@Oliver 我也更新了我的问题