我的数据库中有两个具有相同结构的表。 这些表有很多列,类型和名称完全相同。 假设它们的名称是 OldTable 和 NewTable。 在我的项目中,我有这些表的一个模型。 我需要在表上执行内部联接。 当我尝试时,我使用同一个表进行 SQL 查询,例如:
Select column1 from OldTable oldData
Inner Join OldTable newData on oldData.Column1 = newData.Column1
出了什么问题?
我使用的示例代码:
var oldCtx = _oldDataSource.DataContext.Rows;
var newCtx = _newDataSource.DataContext.Rows;
var query = from oldData in oldCtx
join newData in newCtx
on new { oldData.Column1, oldData.Column2, oldData.Column3, oldData.Column4, oldData.Column5 }
equals new { newData.Column1, newData.Column2, newData.Column3, newData.Column4, newData.Column5 }
where oldData.StartTime >= dateStart && oldData.StartTime < dateStart + timeSpan
select newData;
var newCdrs = query.ToList();
查询结果为:
DECLARE @dateStart TimeStamp -- DateTime
SET @dateStart = TIMESTAMP '2024-01-22 15:54:33.000000'
DECLARE @CallStartTime TimeStamp -- DateTime
SET @CallStartTime = TIMESTAMP '2024-01-22 15:54:34.000000'
SELECT
newData.Column1,
newData.Column2,
newData.Column3,
newData.Column4,
newData.Column5,
.....
FROM
DEV3.OldTable oldData
INNER JOIN DEV3.OldTable newData ON (oldData.COLUMN1 = newData.COLUMN1 OR oldData.COLUMN1 IS NULL AND newData.COLUMN1 IS NULL) AND (oldData.COLUMN2 = newData.COLUMN2 OR oldData.COLUMN2 IS NULL AND newData.COLUMN2 IS NULL) AND (oldData.COLUMN3 = newData.COLUMN3 OR oldData.COLUMN3 IS NULL AND newData.COLUMN3 IS NULL) AND (oldData.COLUMN4 = newData.COLUMN4 OR oldData.COLUMN4 IS NULL AND newData.COLUMN4 IS NULL) AND (oldData.COLUMN5 = newData.COLUMN5 OR oldData.COLUMN5 IS NULL AND newData.COLUMN5 IS NULL)
WHERE
oldData.START_TIME >= :dateStart AND oldData.START_TIME < :CallStartTime
但我预料到了
JOIN DEV3.NewTable
在
linq2db
中,对于这种情况,您可以使用 TableName
、SchemaName
、ServerName
扩展。它们是为 ITable
接口定义的。
var query = from oldData in oldCtx
join newData in newCtx.TableName("NewData")
on new { oldData.Column1, oldData.Column2, oldData.Column3, oldData.Column4, oldData.Column5 }
equals new { newData.Column1, newData.Column2, newData.Column3, newData.Column4, newData.Column5 }
where oldData.StartTime >= dateStart && oldData.StartTime < dateStart + timeSpan
select newData;