Entity Framework Core To SQL问题

APP用户反馈应用反应慢, 经排查发现提现状态刷新服务占用带宽过高. 跟踪问题发现是有一SQL语句

 SELECT `o`.`Id`, `o`.`Amount`, `o`.`AuditedStatus`, `o`.`Createtime`, `o`.`FromUserId`, `o`.`IsDelete`, `o`.`ItemName`, `o`.`OrderNum`,
`o`.`RelatedId`, `o`.`StatId`, `o`.`TaxAmout`, `o`.`Type`, `o`.`UserId`, `o`.`WithdrawStatus`, `o`.`WithdrawedAmout`
FROM `financeincomeexpensesoverview` AS `o`
WHERE `o`.`Amount` > 0.0;

拉取所有提现数据导致.

检查代码未发现这种查询, 找出可能会产生此SQL代码如下:

var incomes = await db.Financeincomeexpensesoverview.Where(o => o.RelatedId == WithdrawRelatedId && GetItmeTypesFromType(type).Contains(o.Type) && o.Amount > 0).ToListAsync();

猜测是EF Core 在linq to sql时出现问题, 查阅Entity Framework Core 文档得到答案:

当在linq语句中出现无法转换为SQL辅助方法时, 会将除去无法转换SQL的语句执行查询将数据拉入内存然后执行剩余无法转换的部分, 文档中称为Client evaluation.

上述语句中RelatedId为可空int类型WithdrawRelatedId为int类型,Type为可空类型GetItmeTypesFromType(type)为List类型, 无法将类型转换变为SQL. 所以实际代码执行如下:

var incomes = await db.Financeincomeexpensesoverview.Where(o => o.Amount > 0).ToListAsync();

incomes = await incomes.Where(o => o.RelatedId == WithdrawRelatedId && GetItmeTypesFromType(type).Contains(o.Type)).ToListAsync();

设置关闭Client evaluation

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

   optionsBuilder
       .UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFQuerying;Trusted_Connection=True;")
       .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));

}

可得出转换错误:

Warning as error exception for warning 'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning': The LINQ expression 'where (([o].RelatedId == Convert(__WithdrawRelatedId_0, Nullable`1)) AndAlso {__GetItmeTypesFromType_1 => Contains(Convert(ToInt32(Convert([o].Type, Object)), Nullable`1))})' could not be translated and will be evaluated locally. To suppress this Exception use the DbContextOptionsBuilder.ConfigureWarnings API. ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.

Entity Framework Core 文档地址: https://docs.microsoft.com/en-us/ef/core/querying/client-eval

转载于:https://www.cnblogs.com/qingyanxiaochen/p/11091400.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值