You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:40:47