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

时间:2019-04-15 13:06:37

标签: entity-framework rest asp.net-web-api 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);
            }

如何更新GameBank模型/表上的referenceId?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您的数据将不会更新,因为您的查询返回的是GameBankVM列表而不是GameBank列表,从技术上来讲,您正在打破SRP,应该更新数据或不查询数据两者都使用相同的方法,您可能需要像这样重构您的方法:

1.-创建用于数据更新的私有方法,在这种情况下,您直接查询GameBank遍历列表项,进行更改并将其保存到数据库,该相同方法可以返回GameBank列表,以避免另一个数据库往返

2.-调用新方法后,在控制器中,您可以运行转换查询以将GameBank列表转换为GameBankVM列表并将其返回到视图。

还有许多其他方法可以做到这一点,我只是建议您使用这种方法,以使您的控制器正常工作。但是,如果您愿意做得更好,则可以创建一个业务层来解析所有业务规则,也可以使用CQS或CQRS之类的模式。