如何将筛选客户设备的foreach循环转换为Linq to Sql表达式
转换后的Linq to SQL写法
你原有的逻辑可以直接合并为单条Linq查询,完全对齐原有逻辑的同时更简洁,执行效率也更高:
// 直接替换原有的foreach相关代码即可 m.devicesList = list .Where(device => device.type == "device1" && device.roles != null && device.roles.Any(role => role.customerId == kunId)) .ToList();
逻辑说明
- 完全对齐原代码的筛选规则:先筛选设备类型为
device1的设备,排除roles为空的设备,最后保留存在关联角色customerId等于当前用户IDkunId的设备 - 使用
Any方法替代原逻辑中Where+FirstOrDefault判空的写法,在Linq to SQL执行时会被翻译成数据库层面的EXISTS子查询,不需要把全量角色数据加载到内存判断,性能更好。
可选优化
如果你使用的ORM提供器会自动处理导航属性的空值映射,device.roles != null的判断可以直接省略,代码会更简洁。
内容的提问来源于stack exchange,提问作者Hassan Shabbir
相关产品推荐
相关产品推荐

