Linq2db 批量删除不适用于 2 个表

问题描述 投票:0回答:1

我需要从另一个相关表过滤的表中批量删除。可能有数百万行,因此我在循环中使用 .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

entity-framework-core linq2db
1个回答
0
投票

看起来像一个错误。尝试以下解决方法。由于您要删除

InvoiceDetails
,因此从该实体开始:

var x = ctx.InvoiceDetails.Where(p => p.Invoice.InvoiceDate <= new DateTime(2023, 9, 14));
var y = x.ToLinqToDB().Take(100000);
y.Delete();
© www.soinside.com 2019 - 2024. All rights reserved.