我是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);
}
如何更新GameBank模型/表上的referenceId?
答案 0 :(得分:0)
在这种情况下,您的数据将不会更新,因为您的查询返回的是GameBankVM列表而不是GameBank列表,从技术上来讲,您正在打破SRP,应该更新数据或不查询数据两者都使用相同的方法,您可能需要像这样重构您的方法:
1.-创建用于数据更新的私有方法,在这种情况下,您直接查询GameBank遍历列表项,进行更改并将其保存到数据库,该相同方法可以返回GameBank列表,以避免另一个数据库往返
2.-调用新方法后,在控制器中,您可以运行转换查询以将GameBank列表转换为GameBankVM列表并将其返回到视图。
还有许多其他方法可以做到这一点,我只是建议您使用这种方法,以使您的控制器正常工作。但是,如果您愿意做得更好,则可以创建一个业务层来解析所有业务规则,也可以使用CQS或CQRS之类的模式。