我有以下两个表,每个表都有数百万条记录,因此需要删除性能
Table Product
(
DateOf date not null,
Type varchar(100) not null,
ProductId int not null,
ProductCategory varchar(100) not null
Primary Key (DateOf,Type)
)
Table ProductListing
(
DateOf date not null,
Type varchar(100) not null,
RowId int identity(1,1) not null,
Quantity int not null,
Primary key(DateOf,Type,RowId)
Foreign key (DateOf,Type) references Product (DateOf,Type)
)
通常删除记录是通过 DateOf 和 ProductCategory 发生的(注意该字段不是主键的一部分)
我有代码 EF 代码,例如假设用户传递日期和类别参数
dbContext.Product.Where(p=> p.DateOf = date && p.ProductCategory = category).ExecuteDelete()
这正确地从 Product 表中删除了相应的记录,但我们需要太高效地从 ProductListing 表中删除记录。理想的删除语句是
Delete pl from
ProductListing pl
inner join Product p on p.DateOf=pl.DateOf and p.Type=pl.Type -- join on foreign key
where
-- below are the parameters passed by user
p.DateOf = date
and p.ProductCategory = category
所以我想使用实体框架生成上述删除语句,并在从产品表中删除之前执行它,并在事务中执行产品删除,如上所示。
我不确定如何强制实体框架核心生成这样的删除语句。请注意,由于记录数量巨大,因此需要上述删除语句,并且该单个语句在一个语句中负责删除
请注意,由于遗留数据原因,无法添加表级联删除。
假设您在
Product
类中有 ProductListing
导航属性,您可以编写以下查询:
using var transaction = dbContext.Database.BeginTransaction();
dbContext.ProductListing
.Where(pl => pl.Product.DateOf = date && pl.Product.ProductCategory = category)
.ExecuteDelete();
dbContext.Product
.Where(p => p.DateOf = date && p.ProductCategory = category)
.ExecuteDelete();
transaction.Commit();