Nhibernate 使用SetFetchMode
请原谅我的业余爱好,但我正在努力在下面的场景Nhibernate 使用SetFetchMode,nhibernate,criteria,fetch,Nhibernate,Criteria,Fetch,请原谅我的业余爱好,但我正在努力在下面的场景 var query = session.CreateCriteria<Notification>().SetFetchMode("Parameters", FetchMode.Select) .CreateAlias("Parameters", "p", JoinType.InnerJoin) .Add(Restrictions.Where<Notification>(x => x.Acknowledged == fal
var query = session.CreateCriteria<Notification>().SetFetchMode("Parameters", FetchMode.Select)
.CreateAlias("Parameters", "p", JoinType.InnerJoin)
.Add(Restrictions.Where<Notification>(x => x.Acknowledged == false));
[列举它]
请注意,我正在使用SELECT作为预取模式。。。一个明显被QueryOver遗漏的选项。。。林克。。。还要注意,获取的表与我加入筛选的表相同
执行该查询将产生以下结果:
SELECT
this_.Id as Id14_1_,
this_.Version as Version14_1_,
this_.Url as Url14_1_,
this_.DispatchType as Dispatch5_14_1_,
this_.Acknowledged as Acknowle6_14_1_,
this_.DateCreated as DateCrea7_14_1_,
this_.NotificationType as Notifica2_14_1_,
p1_.Id as Id15_0_,
p1_.Version as Version15_0_,
p1_.NotificationId as Notifica3_15_0_,
p1_.Name as Name15_0_,
p1_.Value as Value15_0_,
p1_.PairHash as PairHash15_0_
FROM
Notification this_
inner join
NotificationParameter p1_
on this_.Id=p1_.NotificationId
WHERE
this_.Acknowledged = ?p0
and p1_.PairHash in (
?p1
)
ORDER BY
this_.DateCreated desc;
?p0 = False [Type: Boolean (0)],
?p1 = 'V3zmXnv12B3AC26xeG10w+bas4U=' [Type: String (28)]
因此,第一个问题是出于某种原因,NotificationParameter列包含在选择列表中。。。它似乎没有执行select fetch。这是不好的,因为a)我需要选择提取b)提取记录被过滤。获取与连接不同(作为一个概念),连接数据上的过滤器不应该(在本例中)过滤我获取的内容
当然,第二个问题是没有发生SELECT fetch。相反,在第一次访问通知的Parameters属性时,它们被延迟加载:O
有什么帮助吗?另外,如果有一种方法可以使用QueryOver来实现这一点,我更愿意这样做。我注意到我可以使用.underlineCriteria.SetFetchmode(..),但是这对获取的内容没有影响。在sql中,您不能同时过滤和获取所有内容。我还不太熟悉这个问题,但你应该明白
var subquery = DetachedCriteria.For<Notification>()
.CreateAlias("Parameters", "p", JoinType.InnerJoin)
.Add(Restrictions.Where<Notification>(x => x.Acknowledged == false))
.Add(Restrictions.In("p.PairHash", npHashes))
.SetProjection(Projections.Id());
session.CreateCriteria<Notification>()
.Add(Subqueries.PropertyIn("Id", subquery))
.SetFetchMode("Parameters", FetchMode.Eager)
.AddOrder(Order.Asc("DateCreated"))
.List<Notification>();
var subquery=DetachedCriteria.For()
.CreateAlias(“参数”,“p”,JoinType.InnerJoin)
.Add(限制,其中(x=>x.conferenced==false))
.Add(Restrictions.In(“p.PairHash”,npHashes))
.SetProjection(projects.Id());
session.CreateCriteria()
.Add(子查询.PropertyIn(“Id”,子查询))
.SetFetchMode(“参数”,FetchMode.Eager)
.AddOrder(Order.Asc(“DateCreated”))
.List();
我会试试看。。。然而,当我在做一个selectfetch(我认为映射到外部连接时并不急切)时,过滤和获取应该不会相互影响。
var subquery = DetachedCriteria.For<Notification>()
.CreateAlias("Parameters", "p", JoinType.InnerJoin)
.Add(Restrictions.Where<Notification>(x => x.Acknowledged == false))
.Add(Restrictions.In("p.PairHash", npHashes))
.SetProjection(Projections.Id());
session.CreateCriteria<Notification>()
.Add(Subqueries.PropertyIn("Id", subquery))
.SetFetchMode("Parameters", FetchMode.Eager)
.AddOrder(Order.Asc("DateCreated"))
.List<Notification>();