NHibernate: двойные вложенные подзапросы и «Не удалось найти поставщика информации о критериях соответствия ...» - PullRequest
4 голосов
/ 24 января 2011

У меня возникли проблемы при разработке, как получить следующий SQL в NHibernate ICriteria:

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>();

Этот код выше выдает следующее неясное исключение:

Не удалось найти подходящие критерии поставщик информации: contract_inner.Id = contract_outer.Id и doc.Type = rule.DocType

Я сузил проблему до ограничения "contract_inner.Id = contract_outer.Id". Может быть, возникают проблемы при прохождении двух слоев подзапросов?

Я использую NHibernate 2.1.

Кажется, я единственный, кто получает это исключение - если вы отправляете в Google сообщение об исключении, номер один из моих сообщений в Stackoverflow появляется первым. Этот вопрос похож, но отличается. Так расстраивает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...