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