gpt4 book ai didi

NHibernate:子查询.Exists 不起作用

转载 作者:行者123 更新时间:2023-12-02 17:26:07 24 4
gpt4 key购买 nike

我正在尝试使用 NHibernate 的 criteria api 获取如下所示的 sql:

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)

所以基本上,Foos 有很多 Bars,Bars 有很多 Bazes。我想要获取所有具有 Bars 和 Bazes 的 Foo。

要做到这一点,独立的标准似乎是最好的,如下所示:

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 的错误吗?有更好的方法吗?

最佳答案

尝试在子查询的 Bar 类中的 Foo 路径上创建条件或别名,然后应用 eual 限制。

var subquery = DetachedCriteria.For<Bar>("bar")
.SetProjection(Projections.Property("bar.Id"))
.Add(Restrictions.IsNotEmpty("bar.Bazes"))
.CreateCriteria("Foo")
.Add(Restrictions.Eq("bar.FooId","Id"));

或CreateAlias("Foo","foo")

var subquery = DetachedCriteria.For<Bar>("bar")
.SetProjection(Projections.Property("bar.Id"))
.Add(Restrictions.IsNotEmpty("bar.Bazes"))
.CreateAlias("Foo","foo")
.Add(Restrictions.Eq("bar.FooId","foo.Id"));

关于NHibernate:子查询.Exists 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com