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