NHibernate:使用SetProjection返回引用的属性而不延迟加载

NHibernate:使用SetProjection返回引用的属性而不延迟加载,nhibernate,Nhibernate,我映射了以下两个类: public class Foo { public virtual Guid Id { get; set; } public virtual Bar Bar { get; set; } } public class Bar { public virtual Guid Id { get; set; } public virtual string Name { get; set; } } 我有以下准则: return Session.Creat

我映射了以下两个类:

public class Foo
{
    public virtual Guid Id { get; set; }
    public virtual Bar Bar { get; set; }
}
public class Bar
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}
我有以下准则:

return Session.CreateCriteria<Foo>("f")
    .CreateAlias("f.Bar", "b")
    .SetProjection(Projections.Property("f.Bar"))
    .List<Bar>();

注意如何只返回Bar的Id,而不是返回整个类。如何取而代之的是获取所有栏?

解决方案取决于您的需要

首先如果您需要返回实体栏,那么您的初始条件必须是Bar类型,因此您只需:

session.CreateCriteria<Bar>().
       .List<Bar();
  • 使用仅查询属性。为此,请在条形图映射文件中添加access=“noop”

  • 请注意,您的域模型不必更改!您不需要在Bar类中添加“foo”属性/字段。 现在,您可以在查询中使用该属性,如:

    session.CreateCriteria<Bar>()
        .CreateAlias("foo", "f")
        .Add(Restrictions.Eq("f.Id", 9))
        .List<Bar>();
    
    session.CreateCriteria()
    .CreateAlias(“foo”、“f”)
    .添加(限制条件,等式(“f.Id”,9))
    .List();
    
    如果它不符合单个标准,请使用
    分离标准

    var subquery = DetachedCriteria.For<Foo>("f")
        .SetProjection(Projections.Property("f.Bar"))
        // more filter criteria ...
    
    return session.CreateCriteria<Bar>
        .SetProjection(Subqueries.PropertyIn("id", subquery));
    

    显然,只有在子查询中有一些基于Foo的筛选条件时,才有意义。

    如果上述分离的条件查询不起作用,这里是一个简单的HQL查询,应该可以做到这一点

    var hqlQuery="select b from Foo as f inner join f.Bar as b";
    
    现在按如下方式运行此查询:

    Session.CreateQuery(hqlQuery).List<Boo>();
    
    Session.CreateQuery(hqlQuery.List();
    
    如果需要,现在也可以将where条件添加到查询中


    希望这有帮助。。我可以告诉您如何使用条件,但我认为这对您来说更容易使用,因为您似乎对SQL很熟悉。

    在您的代码示例中,您声明了.List(),但是,您说只返回Bar的Id。这是否意味着你得到了一个条形码列表,只有ID属性是水合的?你可能想考虑切换到HQL,除非你有特定的要求迫使你使用标准(动态搜索通常是大的)。
    select Bar.*
    from Bar
    where Bar.id in (Select b.id from Foo f inner join Bar b on ...)
    
    var hqlQuery="select b from Foo as f inner join f.Bar as b";
    
    Session.CreateQuery(hqlQuery).List<Boo>();