如何使用Linq获取未在RentBoats表中的Boat数据?
问题分析与解决方案
我一眼就看出你的Linq查询逻辑出问题啦——你当前的条件是在判断整个RentBoats表中是否存在IsOnRent为false的记录,而不是针对每艘船去检查它有没有出现在RentBoats里。这也就是为什么不管有没有已出租的记录,你的查询结果都不符合预期。
需求1:获取从未被添加到RentBoats表中的Boat
如果你的需求是严格意义上的“未在RentBoats表中的Boat”(即该船只的ID从未出现在RentBoats的BoatID字段中),那么正确的Linq查询应该针对每艘Boat,检查RentBoats里是否存在匹配它ID的记录:
using (var db = new BoatContext()) { return db.Boats.Where(boat => !db.RentBoats.Any(rent => rent.BoatID == boat.BoatID)).ToList(); }
需求2:获取未被出租的Boat(含无Rent记录的情况)
如果你实际是想获取没有处于出租状态的船只(包括从未被添加到RentBoats的,以及RentBoats中IsOnRent为false的),可以调整查询条件,检查该船只是否没有处于出租状态的Rent记录:
using (var db = new BoatContext()) { return db.Boats.Where(boat => !db.RentBoats.Any(rent => rent.BoatID == boat.BoatID && rent.IsOnRent) ).ToList(); }
为什么原查询失效?
你原来的代码!db.RentBoats.Any(x => x.IsOnRent == false)是一个全局判断条件:
- 只要RentBoats表中存在任意一条IsOnRent为false的记录,这个表达式就返回
false,导致Where子句过滤掉所有船; - 如果整个RentBoats表中没有IsOnRent为false的记录,表达式返回
true,就会返回所有Boat数据。
这完全不是针对单艘船的针对性判断,自然无法得到你想要的结果。
内容的提问来源于stack exchange,提问作者AllramEst
相关产品推荐
相关产品推荐

