EF Linq多对一关联查询返回父实体的属性筛选写法问题
写法不生效的核心原因
Any() 和 Where() 的返回值类型完全不同,不满足Where筛选的参数要求:
Any()返回布尔值,只要集合中存在符合条件的元素就返回true,刚好可以作为筛选判断条件,所以原写法可以正常执行。Where()返回的是符合条件的元素集合(IQueryable<Car>/IEnumerable<Car>类型),无法直接作为布尔判断条件,类型不匹配就会出现编译报错或者EF无法解析查询的问题。
正确写法
场景1:当前Person与Car为多对一关联(每个Person仅对应1个Car)
不需要遍历集合,直接访问单个关联的Car属性判断即可,写法更简洁高效:
PersonQuery.Include(p => p.Car).Where(p => ListOfColors.Contains(p.Car.Color));
场景2:若为Person与Car一对多关联,需要用Where替代Any实现相同筛选逻辑
需要额外判断Where筛选后的集合是否不为空,等价于Any的执行效果:
PersonQuery.Include(p => p.Cars) .Where(p => p.Cars.Where(car => ListOfColors.Contains(car.Color)).Any());
注:该写法和直接调用
Any的执行效率完全一致,EF会翻译成相同的SQL语句,不存在性能差异。如果没有必须用Where的特殊要求,直接调用Any写法更直观。
内容的提问来源于stack exchange,提问作者Jerker Pihl
相关产品推荐
相关产品推荐

