将 2 个复杂的 DataTables 合并到 DataGridView C# 的问题

Issues Merging 2 complex DataTables to a DataGridView C#

我有 2 个由 2 个复杂查询组成的数据表,我想在 C# 代码中合并并绑定到 datagridview 的结果。我不想再次对 2 sql 进行任何连接,因为它已经很复杂了,我在 C# 代码中为此使用了动态 sql。 (sql 服务器紧凑型 - SP 不可能)。

我使用的代码:

dataT = FkDataAccess.GetDataPostsCars(selTmpMPs,fromDateTime, toDateTime);
dataTLocationsTransposed = FkDataAccess.GetLocationDetailsTransposed();
dataTMerged = dataTLocationsTransposed.Copy();
dataTMerged.Merge(dataT);
this.dataGridView1.DataSource = dataTMerged;

dataT 结果包含包含一些数据的列:

<<== 标记的是 dataTLocationsTransposed 中要合并到 dataT 的预期行

MonitorDateTime     MainGate        SouthAdminBuilding  WestGate    
                    Main-Date det.. South side of admin…west-gate det…<<==  
01.02.2014 13:00    6               5                   3         <-dataT
21.02.2014 14:00    45              6                   8         <-dataT

dataTLocationsTransposed 获取上述列的详细信息,我使用 2 个查询 Q1 和 Q2 进行了测试。 Q1 有效,作为新行添加到 dataT 列结构中,但它创建了 4 个其他列名称 Column1 等。除了上面显示的列之外。我需要 dataT 列结构正下方的结果。

Q1:

SELECT '', 
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END), 
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription ELSE '' END), 
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END) 
FROM MonitorLocationDetails 
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')

这会产生如下结果:

col1 col2 col3 col4 MonitorDateTime MainGate SouthAdminBuilding WestGate

预计我想要的是没有 col1、col2..... 但就在指定的列名称下方。

因此,当我将 Q1 修改为 Q2 时,它也会产生结果,但它在来自 C# 的 Merge 调用中失败。

Q2:

SELECT '' AS MonitorDateTime, 
MAX(CASE WHEN LocColumn = 'MainGate' THEN LocDescription ELSE '' END) 
AS MainGate, 
MAX(CASE WHEN LocColumn = 'SouthAdminBuilding' THEN LocDescription 
ELSE '' END) AS SouthAdminBuilding, 
MAX(CASE WHEN LocColumn = 'WestGate' THEN LocDescription ELSE '' END) 
AS WestGate 
FROM MonitorLocationDetails 
WHERE LocColumn IN ('MainGate','SouthAdminBuilding','WestGate')

查询其他合并数据表 dataT 是:

SELECT T.MonitorDateTime,T.MainGate,T.SouthAdminBuilding,T.WestGate 
FROM GdRateTempPosts T WHERE T.MonitorDateTime BETWEEN @fromDateTime 
AND @toDateTime ORDER BY T.MonitorDateTime

非常感谢任何帮助。谢谢。

T.MonitorDateTime 似乎是 DATETIME 值

'' AS MonitorDateTime 是 VARCHAR

我猜它不会合并这些,除非数据类型匹配。将所有日期转换为 VARCHAR 或使用 NULL 而不是 ''。

原来使用 LINQ Union 可以工作。创建了 2 个 List 对象并将每个数据表 1 和 2 的数据行添加到这些对象中。然后执行列表联合和 CopToDataDataTable() 并且它起作用了。

dataTLocationsTransposed =  FkDataAccess.GetLocationDetailsTransposed(selectedPostCombined);
            List<DataRow> list1 = new List<DataRow>();
            foreach (DataRow dr in dataT.Rows)
            {
                list1.Add(dr);
            }
            List<DataRow> list2 = new List<DataRow>();
            foreach (DataRow dr in dataTLocationsTransposed.Rows)
            {
                list2.Add(dr);
            }
            dataTMerged = list2.Union(list1).CopyToDataTable();
            this.dataGridView1.DataSource = dataTMerged;