EF Core中条件Where子句查询不生效问题求解
问题根因
代码的核心疏漏是对LINQ查询方法的执行特性理解错误:
Where属于延迟执行的LINQ扩展方法,不会在调用时修改原IQueryable实例,每次调用都会生成一个携带对应过滤逻辑的全新查询对象返回。- switch分支中仅调用了
query.Where(...),但没有将方法返回的新查询对象重新赋值给query变量,后续排序、执行使用的始终是未添加任何过滤条件的原始查询,因此最终返回全量评论数据。
修正代码
public List<Comments> GetCommentsByResource(string ResourceName, Guid ResourceID) { var query = CommentsManager.GetQueryable(); switch (ResourceName) { case "Bike": query = query.Where(x => x.BikeID == ResourceID); break; case "Skis": query = query.Where(x => x.SkiID == ResourceID); break; case "Helmet": query = query.Where(x => x.HelmetID == ResourceID); break; case "Scooter": query = query.Where(x => x.ScooterID == ResourceID); break; default: // 增加非法入参处理,避免传入未知资源类型时返回全量数据 throw new ArgumentException($"不支持的资源类型:{ResourceName}", nameof(ResourceName)); } return query.OrderByDescending(o => o.CreatedOn).ToList(); }
注意事项
所有返回IQueryable/IEnumerable类型的LINQ方法(包括Where、OrderBy、Select、Skip、Take等)都符合该特性,只有调用ToList()、ToArray()、First()、Count()这类立即执行方法时,才会真正执行查询逻辑返回结果。
内容的提问来源于stack exchange,提问作者user101289
相关产品推荐
相关产品推荐

