Я пытаюсь получить sql, как показано ниже, используя критерии API NHibernate:
SELECT * FROM Foo
WHERE EXISTS (SELECT 1 FROM Bar
WHERE Bar.FooId = Foo.Id
AND EXISTS (SELECT 1 FROM Baz
WHERE Baz.BarId = Bar.Id)
Так что в основном у Фоо есть много баров, а у баров много баз. Я хочу получить все фу, у которых есть слитки с базой.
Для этого лучше всего подойдет отдельный критерий, например:
var subquery = DetachedCriteria.For<Bar>("bar")
.SetProjection(Projections.Property("bar.Id"))
.Add(Restrictions.Eq("bar.FooId","foo.Id")) // I have also tried replacing "bar.FooId" with "bar.Foo.Id"
.Add(Restrictions.IsNotEmpty("bar.Bazes"));
return Session.CreateCriteria<Foo>("foo")
.Add(Subqueries.Exists(subquery))
.List<Foo>();
Однако это вызывает исключение:
System.ArgumentException: Не удалось найти поставщика информации о критериях соответствия для: bar.FooId = foo.Id и bar.Bazes не пусто
Это ошибка с NHibernate? Есть ли лучший способ сделать это?