EF6 是否可以在 lambda 查询后更新模型/表?



我是lambda查询模型(我与其他类进行投影 - GameBankVM,GameCouponBankVM),最后,我想通过查询结果循环并更新模型字段。但是我得到实体或复杂类型"EPINMiddleWareAPI.Models.GameBankVM"无法在LINQ to Entities查询中构造。

这是我的示例代码:

var gameBankResult = await (context.GameBanks.Where(g => g.productCode == initiate.productCode)
.Take(initiate.quantity)
.Select(g => new GameBankVM
{
quantity = g.quantity,
currency = g.currency,
initiationResultCode = g.initiationResultCode,
productCode = g.productCode,
productDescription = g.productDescription,
referenceId = g.referenceId,
responseDateTime = g.responseDateTime,
unitPrice = g.unitPrice,
totalPrice = g.totalPrice,
coupons = g.coupons.Select(c => new GameCouponBankVM
{
Pin = c.Pin,
Serial = c.Serial,
expiryDate = c.expiryDate
}).ToList() 
})).ToListAsync(); 
if (gameBankResult.Count() != 0)
{
foreach (var item in gameBankResult)
{
item.referenceId = initiate.referenceId;
context.Entry(item).State = System.Data.Entity.EntityState.Modified;
}

await context.SaveChangesAsync();
return Ok(gameBankResult);
}

如何更新我的游戏银行模型/表上的引用 ID?

在这种情况下,您的数据不会更新,因为您的查询返回的是 GameBankVM 列表而不是 GameBank 列表,现在从技术上讲,您正在破坏 SRP,您应该更新数据或查询数据而不是在同一方法中,您可能希望像这样重构您的方法:

1.-创建一个用于数据更新的私有方法,在这种情况下,您直接查询GameBank迭代列表条目,进行更改并将其保存到数据库中,该方法可以返回GameBank列表以避免再次数据库往返。

2.-调用新方法后,可以在控制器中运行转换查询,将游戏银行列表转换为游戏银行虚拟机列表并将其返回到视图。

还有许多其他方法可以做到这一点,我只是建议将其作为使控制器工作的影响较小的方法。但是,如果您愿意使事情变得更好,则可以创建一个业务层来解析所有业务规则,也可以使用 CQS 或 CQRS 等模式。

最新更新