我有一个使用 EF Core 在 C# 中创建列表的查询:
List<DebtCollectionList> debtCollections =
_context.Transactions
.Where(x => x.Status == 0
&& x.TransactionDate <= compareDate && !x.Processed)
.Select(x => new DebtCollectionList
{
transaction_id = x.TransactionId,
iin_pan = x.IinPan,
transaction_date = (DateTime)x.TransactionDate,
amount = (decimal)x.Amount
})
.ToList();
然后我对返回的行执行
foreach
。我需要在处理每一行后更改布尔值。
更新
foreach
中每一行的最佳方法是什么。我真的不想运行新的上下文,因为它已经存在了。
foreach (var debt in debtCollections)
{
}
您可以使用 EF Core 7
ExecuteUpdate
:
// collect Ids
var transactionIds = debtCollections.Select(t => t.TransactionId).ToList();
_context.Transactions
.Where(t => transactionIds.Contains(t.TransactionId))
.ExecuteUpdate(setters => setters.SetProperty(t => t.Processed, true));
要在 Entity Framework Core (EF Core) 上下文中更新 foreach 循环中的每一行而不启动新上下文,您可以按照以下步骤操作。此方法使用与您用来查询交易的相同 _context。关键是在循环内标记每个已处理的事务,然后将更改保存到数据库。
查询和处理交易:由于您已经通过查询获取交易,因此您可以循环遍历它们并更新必要的字段。
更新实体:在
foreach
循环中,找到上下文中的每个交易并更新其 Processed
字段。
将更改保存到数据库:更新所有必要的事务后,需要将更改保存回数据库。这是在循环之后有效完成的,将所有更改捆绑到单个事务中。
以下是如何修改代码来实现此目的:
List<DebtCollectionList> debtCollections =
_context.Transactions
.Where(x => x.Status == 0 && x.TransactionDate <= compareDate && !x.Processed)
.Select(x => new DebtCollectionList
{
transaction_id = x.TransactionId,
iin_pan = x.IinPan,
transaction_date = (DateTime)x.TransactionDate,
amount = (decimal)x.Amount
})
.ToList();
foreach (var debt in debtCollections)
{
// Find the transaction by ID in the context
var transaction = _context.Transactions.FirstOrDefault(t => t.TransactionId == debt.transaction_id);
// Check if the transaction is not null and mark it as processed
if (transaction != null)
{
transaction.Processed = true;
}
}
// Save the changes to the database
_context.SaveChanges();