NHibernate QueryOver条件And子句问题:拆分判断致重复实例
NHibernate QueryOver 条件拆分问题解决方法
原始代码与问题
var query = _session.QueryOver<CRMPhoneCall>(); if (filter.Subject != null) { query.JoinQueryOver<CRMPhoneCall_Subject> (p => p.PhoneCall_Subject) .JoinQueryOver(d => d.Subject) .And(s => s.Id == filter.Subject.Id) //filter.Subject.Id有值时应用 .And(s => s.Parent == null); //filter.OnlyMainSubject为true时应用 }
当前代码将filter.Subject和filter.OnlyMainSubject的过滤逻辑绑定在同一个if块中,若强行拆分为两个独立if语句,会导致QueryOver重复生成关联查询实例,引发查询异常或结果错误。
正确拆分实现
要避免重复关联问题,核心是仅执行一次Join操作获取Subject的查询实例,再基于该实例分别追加不同过滤规则:
var query = _session.QueryOver<CRMPhoneCall>(); QueryOver<Subject> subjectQuery = null; // 只要任一条件需要生效,就执行一次Join操作 if (filter.Subject != null || filter.OnlyMainSubject) { var phoneCallSubjectQuery = query.JoinQueryOver<CRMPhoneCall_Subject>(p => p.PhoneCall_Subject); subjectQuery = phoneCallSubjectQuery.JoinQueryOver(d => d.Subject); } // 单独处理Subject ID匹配条件 if (filter.Subject != null) { subjectQuery.And(s => s.Id == filter.Subject.Id); } // 单独处理仅主主题的过滤条件 if (filter.OnlyMainSubject) { subjectQuery.And(s => s.Parent == null); }
逻辑说明
- 先通过一次判断触发Join操作,确保仅生成一组关联查询实例
- 两个过滤条件独立判断,分别向同一个
subjectQuery实例添加规则,既实现了逻辑拆分,又保证QueryOver结构正确
内容的提问来源于stack exchange,提问作者Rohullah Rajaee Rad
相关产品推荐
相关产品推荐

