基于LinqKit PredicateBuilder的搜索本地正常,发布至文件夹后失效求助
问题分析与解决
核心问题出在谓词组合的最后一步:你调用outerFilter.And(predicatefilter)但没有将结果赋值回outerFilter。PredicateBuilder的And/Or方法是返回新的表达式实例,不会修改原对象。本地环境可能因为是内存集合(IEnumerable)查询,过滤逻辑意外生效;但发布后使用EF等ORM的IQueryable查询时,未正确组合的谓词会导致搜索条件完全失效。
修正后的代码
var outerFilter = PredicateBuilder.True<TERP_LS_BUILDING_ENTRY>(); if (codes != null) { outerFilter = outerFilter.And(i => codes.All(c => i.TO_UNIT_NO.Contains(c))); } var predicatefilter = PredicateBuilder.False<TERP_LS_BUILDING_ENTRY>(); if (!string.IsNullOrEmpty(search_text)) { string searchTextLower = search_text.ToLower().Trim(); predicatefilter = predicatefilter.Or(i => i.VISITOR_NAME.Contains(searchTextLower)); predicatefilter = predicatefilter.Or(i => i.TO_UNIT_NO.Contains(searchTextLower)); } // 关键修正:将组合后的表达式赋值回outerFilter outerFilter = outerFilter.And(predicatefilter);
额外排查点
- 确认发布环境中已正确部署LinqKit的NuGet包,无依赖缺失
- 检查发布环境中
codes和search_text的传入值,是否存在空值、编码差异等问题 - 如果使用EF,确保查询最终调用了
ToList()/FirstOrDefault()等触发执行的方法,且无其他逻辑覆盖当前谓词
内容的提问来源于stack exchange,提问作者sid
相关产品推荐
相关产品推荐

