我需要从另一个相关表过滤的表中批量删除。可能有数百万行,因此我在循环中使用 .Take() - 以免填充事务日志。我收到 SqlException:为“t1”多次指定了“InvoiceId”列。
var x = ctx.Invoices.Where(p => p.InvoiceDate <= new DateTime(2023, 9, 14)).SelectMany(p =>p.InvoiceDetails);
var y = x.ToLinqToDB().Take(100000);
y.Delete();
转换为
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 6.0.13 initialized 'Context' using provider 'Microsoft.EntityFrameworkCore.SqlServer:6.0.13' with options: SensitiveDataLoggingEnabled
info: LinqToDB[0]
-- SqlServer.2008
DECLARE @take Int -- Int32
SET @take = 10
DECLARE @InvoiceDate Date
SET @InvoiceDate = CAST('2023-09-14T00:00:00.0000000' AS DATETIME2)
DELETE [c]
FROM
(
SELECT TOP (@take)
*
FROM
[Invoices] [p]
INNER JOIN [InvoiceDetails] [c_1] ON [p].[InvoiceId] = [c_1].[InvoiceId]
WHERE
[p].[InvoiceDate] = @InvoiceDate
) [t1]
fail: LinqToDB[0]
Failed executing command.
Microsoft.Data.SqlClient.SqlException (0x80131904): The column 'InvoiceId' was specified multiple times for 't1'.
我尝试了多种不同的编码方式,查询语法、方法语法。 如果它只是一张表 .Delete() 工作正常。也尝试过 .ToLinq2DbTable() 有同样的错误。
Linq2db 版本 6.7.1 EF Core 版本 6.0.13
看起来像一个错误。尝试以下解决方法。由于您要删除
InvoiceDetails
,因此从该实体开始:
var x = ctx.InvoiceDetails.Where(p => p.Invoice.InvoiceDate <= new DateTime(2023, 9, 14));
var y = x.ToLinqToDB().Take(100000);
y.Delete();