【发布时间】:2018-08-11 17:39:03
【问题描述】:
您好 Stack Overflow 社区,我有一个存储过程(我无法修改,因此只能处理返回的数据),它可以返回如下数据:
Group Code Value
===========================
GroupA 13 123
GroupA 17 456
GroupB 17 789
但是,我需要将这个结果数据处理成如下所示:
Group Code Value
===========================
GroupA 13 123
GroupA 17 456
GroupB 17 789
GroupB 13 NULL
... 这样我最终可以在 Code 列上使用 LINQ 的 groupBy() 来获得这个结果:
Group Code Value
===========================
GroupA 17 456
GroupB 17 789
Group Code Value
===========================
GroupA 13 123
GroupB 13 NULL
因此,我们几乎是在使用 Group 列和 Code 列中的唯一值进行笛卡尔积,并将这些数据连接到我们的原始数据。我可以像这样在 SQL 中相当简单地做到这一点:
DECLARE @TableData table (
[GroupName] nvarchar(200),
Code int,
Value int
);
DECLARE @CartesianProductTable table
(
GroupName nvarchar(200),
Code int
);
INSERT @TableData values
('GroupA', 13, 123),
('GroupB', 17, 456),
('GroupA', 17, 789)
INSERT
@CartesianProductTable
SELECT * FROM (
SELECT DISTINCT(GroupName) FROM @TableData
) T1, (
SELECT DISTINCT(Code) FROM @TableData
) T2
SELECT
c.GroupName,
c.Code,
t.Value
FROM
@TableData t RIGHT OUTER join
@CartesianProductTable c on t.GroupName = c.GroupName AND t.Code = c.Code
所以我的问题是,在我将数据作为 C# 中的 DataTable 检索后,我该如何在 Linq 中执行此操作?我想我可以像这样按 代码 列分组:
var tableDataGrouped = dataTable.AsEnumerable()
.GroupBy(r => r.Field<int>("Code"))
.Select(x => x.CopyToDataTable());
但它给了我这样的数据:
Group Code Value
===========================
GroupA 17 456
GroupB 17 789
Group Code Value
===========================
GroupA 13 123
当我需要返回的 LINQ 数据是这样的:
Group Code Value
===========================
GroupA 17 456
GroupB 17 789
Group Code Value
===========================
GroupA 13 123
GroupB 13 NULL
我对 LINQ 还很陌生,所以您能指出的任何提示都会有很大帮助。
【问题讨论】:
标签: c# sql linq join datatable