NHibernate:双嵌套子查询和;找不到匹配的条件信息提供程序…“;

NHibernate:双嵌套子查询和;找不到匹配的条件信息提供程序…“;,nhibernate,Nhibernate,我在解决如何将以下sql导入NHibernate iLiteria时遇到问题: select * from Contract contract_outer where exists ( select 1 from RequiredDocRules where not exists ( select 1 from Contract contract_inner inner join ContractDocs contractDocs on cDocs

我在解决如何将以下sql导入NHibernate iLiteria时遇到问题:

select * from Contract contract_outer
where exists (
    select 1 from RequiredDocRules
    where not exists (
        select 1 from Contract contract_inner
        inner join ContractDocs contractDocs on cDocs.ContractId = c_inner.Id
        inner join Doc doc doc.Id = contractDocs.DocId
        where contract_inner.Id = contract_outer.Id
        and doc.Type = RequiredDocRules.DocType)
    )
    and RequiredDocRules.ContractType = contract_outer.Type
)
基本上,查询的意思是“根据此类合同的规则,显示缺少所需文档的合同”

CreateCriteria如下所示:

var subqueryB = DetachedCriteria.For<Contract>("contract_inner")
    .CreateAlias("contract_inner.Docs", "doc")
    .Add(Restrictions.EqProperty("doc.Type", "rule.DocType"))
    .Add(Restrictions.EqProperty("contract_inner.Id", "contract_outer.Id")
    .SetProjection(Projections.Id());        

var subqueryA = DetachedCriteria.For<RequiredDocRule>("rule")
    .Add(Restriction.EqProperty("rule.ContractType", "contract_outer.Type"))
    .Add(Subqueries.NotExists(subqueryB))
    .SetProjection(Projections.Id());

return Session.CreateCriteria<Contract>("contract_outer")
    .Add(Subqueries.Exists(subqueryA))
    .List<Contract>();
var subqueryB=DetachedCriteria.For(“合同内部”)
.CreateAlias(“合同\内部文件”,“文件”)
.Add(Restrictions.EqProperty(“doc.Type”、“rule.DocType”))
.Add(限制.EqProperty(“contract\u inner.Id”、“contract\u outer.Id”)
.SetProjection(projects.Id());
var subqueryA=DetachedCriteria.For(“规则”)
.Add(Restriction.EqProperty(“rule.ContractType”、“contract\u outer.Type”))
.Add(子查询.NotExists(子查询B))
.SetProjection(projects.Id());
返回会话。CreateCriteria(“合同外部”)
.Add(subquerys.Exists(subqueryA))
.List();
上述代码引发以下模糊异常:

找不到匹配的条件 信息提供者:contract\u inner.Id= 合同号和单据类型= rule.DocType

我已经将问题缩小到“contract\u inner.Id=contract\u outer.Id”限制。也许它在向上遍历两层子查询时遇到了问题

我正在使用NHibernate 2.1 btw


我似乎是唯一一个收到此异常的人-如果你搜索异常消息,我的另一篇Stackoverflow帖子会排在第一位。这个问题很相似,但不同。太令人沮丧了!

有什么特别的原因要使用标准而不是HQL吗?只是为了整个存储库的一致性。这是一个痛苦的结束w编写查询,然后发现它不起作用,必须将其全部转换为HQL。您考虑过使用Linq2Nhibernate吗?请看这篇文章: