LINQ语句差异探究:Select与Where顺序对数据加载及性能的影响
两段LINQ语句的数据加载与性能差异分析
数据加载逻辑差异
- 第一段代码:先通过
Select(y => y.Id)提取source中所有元素的Id,再对提取出的Id集合做空值过滤。也就是说,不管原对象的Id是否为空,都会先把所有Id都取出来,再进行筛选。 - 第二段代码:先通过
Where(y => !string.IsNullOrEmpty(y.Id))筛选出Id不为空的原对象,再对这些符合条件的对象提取Id。只会处理那些Id有效的对象,不会去碰Id为空的对象的Id属性。
性能差异
- 当
source中存在大量Id为空的元素时,第二段性能优势明显:提前过滤掉无效对象,减少了后续Select操作的执行次数,避免了无意义的Id提取。 - 若
source里几乎没有Id为空的元素,两者性能差异可以忽略,因为最终处理的元素量级基本一致。 - 额外注意:如果
y.Id是耗时属性(比如需要计算、或数据库延迟加载的字段),第二段的性能优势会被放大——它不会去获取那些被过滤掉的对象的Id,省去了不必要的开销。
另外补充:如果是LINQ to SQL/EF这类数据库查询场景,多数ORM会自动优化这两个查询的执行顺序,最终生成的SQL可能完全一致,数据库会自行调整执行计划,但这取决于具体ORM的实现逻辑。
内容的提问来源于stack exchange,提问作者TheAnonymousModeIT
相关产品推荐
相关产品推荐

