-
我写了个用 yield return 返回过滤结果的 C# 方法、在方法开头加了参数为空就抛异常的校验,调用处也老老实实包了 try-catch,结果传 null 进去那个异常死活没被 catch 住一路飞到最外层,盯着代码看半天才反应过来整个方法体压根没在调用那一刻执行的深度复盘
我写了个 C# 方法,接收一个集合和阈值、用 yield return 逐个吐出大于阈值的元素,很注意防御地在方法第一行就校验:集合为 null 就抛 ArgumentNullException,调用方也规规矩矩把调用包在 try-catch 里准备优雅降级。可上线后一个 null 传进来程序直接崩了:异常确实抛了,却没被那个明明包着调用的 try-catch 接住,而是穿过它一路冒泡到最顶层。我…- 0
- 0
-
我在 C# 里写了个 LINQ 查询赋给一个变量,以为它已经是查询结果了,结果那个耗时的过滤被反复执行了好多次,还有一次枚举时拿到的数据跟我预期的完全不一样:一次没搞懂 LINQ 延迟执行的深度复盘
我有段代码从数据源筛元素,判断条件是个耗时操作,写成 var result = source.Where(x => SlowCheck(x))。后面用了好几次:result.Count() 看数量、foreach 遍历、result.Any() 判断。我想当然以为 result 就是算好的结果集、几次用的是同一份数据。可接口慢得反常,加日志才傻眼:那个耗时的 SlowCheck 被执行了好几…- 0
- 0
-
我写了个 LINQ 查询,以为它只执行了一次,结果发现里面那个耗时的转换被重复执行了好几遍,性能差得离谱,我对着 LINQ 延迟执行每次枚举都重新跑一遍这个坑排查大半天的复盘
一个让我对 C# 的 LINQ 从会用到真懂的坑,隐蔽在代码逻辑完全正确结果也对、只是慢得莫名其妙,而慢的原因是我以为只执行一次的查询其实在每次用到它时都从头到尾重新执行了一遍。一段数据处理用 LINQ 写得很优雅:var query = data.Where(x=>x.IsValid).Select(x=>SlowTransform(x)),然后对 query 用了 Count、Fi…- 0
- 0
-
我的 C# 查询代码明明只写了一遍,数据库却被查了好几次、结果还前后对不上,我对着 LINQ 的延迟执行排查了大半天的复盘
在一个 .NET 后台服务里我写了段统计代码:从数据库查出一批订单,然后统计总数、求和金额、再取前几条,一个 LINQ 查询"复用"三次,自觉很 DRY。上线后却两个怪事:数据库监控显示那条查询每次执行竟被打了三遍;统计的总数和求和明细条数偶尔对不上。盯着这段"明明只写了一次查询"的代码百思不得其解,排查大半天才撞上 LINQ 最经典也最阴险的特性——延迟执…- 0
- 0
-
我在 C# 里把一个 LINQ 查询当结果反复用,先 Count 再 foreach,结果同一个查询被默默执行了好多遍、数据库往返暴增,我排查了大半天的复盘
我用 LINQ 筛了一批数据 var results = items.Where(...),然后很自然地把它当结果反复用:先 Count 看几条、再 foreach 处理、后面又 Any 判断。结果性能差得离谱,数据源是数据库时同一句 SQL 被重复执行了好几遍,筛选条件含会变的东西时 Count 和 foreach 数量还对不上。深挖才懂是 LINQ 的延迟执行:var results = it…- 0
- 0
-
我以为 LINQ 查询在定义那一行就执行完了,结果它每次遍历都重新查一遍数据库,还因为延迟执行读到了中途变化后的数据的深度复盘
我写 var query = db.Users.Where(...),以为这行就把结果查回来存进 query 了。可程序处处诡异:同一个 query 被用了好几次(Count、foreach、Any),数据库日志里同一查询竟执行了好几遍;更怪的是先 Count 是 100,中间插了几条数据,再 foreach 遍历竟是 103,同一 query 两次结果对不上。深究才懂 LINQ 是延迟执行:定义…- 0
- 0
-
我以为只查了一次,它却悄悄查了五次:C# 里 LINQ 的延迟执行,让我的接口慢了整整五倍还浑然不觉的那次深夜性能排查复盘
接口慢得不正常,慢查询日志里同一条查询在一次调用里出现了五次。我代码里明明只写了一行 var orders = db.Orders.Where(...),怎么会查五次?根因是 LINQ 的延迟执行——这行只是定义了一个查询、并没真去查库;我后面的 Count/Sum/Where.ToList/GroupBy/Any 每一个都是立即执行操作,每一个都触发了完整查询一遍。这篇从延迟执行的机制讲到 To…- 0
- 0
-
一次查询被执行五六遍:LINQ 延迟执行避坑复盘
这个性能 bug 藏得极深,深到我盯着代码反复看了好几遍都觉得这逻辑没毛病啊:一个 C# 写的报表接口慢得离谱,要好几秒才返回。我上 profiler 一抓愣住了——一个本该只执行一次的数据库查询竟然被执行了五六次之多,可我代码里明明只查了一次啊,我把查询结果赋给了一个变量,后面只是对这个变量做了点判断遍历统计,怎么会反反复复查库?排查到最后真相指向 C#/LINQ 里一个极其经典却极其隐蔽的特性…- 0
- 0
-
一句 LINQ 查了五六遍:C# 延迟执行避坑复盘
有个报表接口从数据库查出一批订单再做几轮统计:算总数、算总金额、按状态分组,代码用 LINQ 写得清清爽爽我自觉优雅极了。可上线后这个接口慢得离谱,几百条数据的报表能跑好几秒,逻辑明明很简单数据量也不大怎么会这么慢?直到打开数据库 SQL 日志整个人都不好了:就这一次接口调用,同一条查询订单的 SQL 被原原本本执行了五六遍。我明明只写了一句 db.Orders.Where,怎么会查五六次?真凶浮…- 2
- 0
延迟执行
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!









