2011-04-16 95 views
1

使用属性值我有以下子/标准:NHibernate的:建立子查询从外部查询

var sq = DetachedCriteria.For<Title>() 
    .CreateAlias("Genres", "genre") 
    .Add(Restrictions.IsNull("genre.ParentId")) 
    .SetProjection(Projections.Property<Genre>(g=>g.Name)); 

var q = 
    session.CreateCriteria(typeof(Title)) 
     .SetProjection(
      Projections.Alias(Projections.SqlFunction("array", null, Projections.SubQuery(sq)), "TopLevelGenre"), 
      Projections.Property<Title>(t1=>t1.Id) 
     ) 
     .SetMaxResults(5); 

导致下面的SQL查询:

SELECT array((SELECT this_0_.title as y0_ 
      FROM title this_0_ 
       inner join title_genre genres3_ 
        on this_0_.title_id = genres3_.title_id 
       inner join genre genre1_ 
        on genres3_.genre_id = genre1_.genre_id 
      WHERE genre1_.parent_id is null)) as y0_, 
    this_.title_id        as y1_ 
FROM title this_ 
limit 5 /* :p1 */ 

如何设置以便我的子查询使用来自外部查询的属性的值?例如,我想让子查询按title_id值过滤。 NHibernate中有什么允许我将属性值投影到子查询中?

谢谢!

回答

0

原来我很近。我所要做的只是为Title创建一个别名,并在子查询的Where子句中使用它。

Title title = null; 

c = Session 
    .QueryOver(() => title) 
    .... 
    .SelectList(list => list 
     .Select(Projections.Alias(Projections.SqlFunction("array", null, Projections.SubQuery(sq.Where(tt => tt.Id == title.Id))), "TopLevelGenre")) 
); 

希望帮助别人..