之前一直在用EFCORE1.0,升级成3.0后就没有FromSql了,变成FromSqlRaw,为什么不升级3.0,是因为官方存在内存泄露,顶级投影被削弱,重要的关键根本没改进,还不如不要,折腾了我一整个春节。
//来源
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.x/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client
影响较大的更改
不再在客户端上计算 LINQ 查询
旧行为
在 3.0 之前,当 EF Core 无法将查询中的表达式转换为 SQL 或参数时,它会在客户端上自动计算表达式的值。 默认情况下,客户端对潜在的昂贵表达式的计算仅触发警告。
新行为
从 3.0 开始,EF Core 仅允许在客户端上计算顶级投影中的表达式(查询中的最后一个 Select() 调用)。 当查询的任何其他部分中的表达式无法转换为 SQL 或参数时,将引发异常。
原因
自动的客户端查询计算允许执行许多查询,即使它们的重要组成部分无法转换。 此行为可能导致意外且具有潜在破坏性的行为,这些行为可能仅在生产中变得明显。 例如,Where() 调用中无法转换的条件可能导致表中的所有行从数据库服务器传输且筛选器应用于客户端。 如果在开发中表中只包含几行,则不容易检测到这种情况,但是当应用程序转入生产环节时,由于表中可能包含数百万行,这种情况会非常严重。 在开发过程中,客户端求值警告也很容易被忽视。
除此之外,自动客户端计算可能会导致问题,其中改进特定表达式的查询转换会导致版本之间发生意外中断性变更。
缓解措施
如果无法完全转换查询,则以可转换的形式重写查询,或使用 AsEnumerable()、ToList() 或类似信息将数据显式返回客户端,然后可以进一步使用 LINQ 到对象处理。
///
意思就是说
temp_query = temp_query.Where(p => Misc.matAccountAmount_type2(p.card_set, singleList.ToArray(), singleList_Count.ToArray())).AsQueryable();
不支持 Misc.matAccountAmount_type2这个方法在sql中运行了
之前这样运行,所有的运算结果都是sql那边,而不是在.net,这个其实也是挺奇怪的计算,所以砍掉其实无可厚非,但是砍掉就砍掉 之前2.0升级到3.0老是出现内存泄露,这个也是在bug修复列表中,这么多年过去也不知道修复了没有,这次直接就用ef core 6.0
测试了下 按官方修改成这种样子 对性能也没太大影响,就是不知道内存还会不会泄露。
temp_query = temp_query.AsEnumerable().Where(p => Misc.matAccountAmount_type2(p.card_set, singleList.ToArray(), singleList_Count.ToArray())).AsQueryable();
持续测试中