QueryOver:从子查询中选择列

时间:2014-10-06 09:36:42

标签: c# .net nhibernate queryover

如何从不同的表中的子查询中选择/投影值到我的主查询?

我有这样的NH模型:

[Serializable]
public class MyModel
{
    public virtual int Id {get; set;}
    //more mapped values
    ....
    //unmapped values
    public virtual string ValueFromOtherTable {get;set;}
}

我想用这样的左连接填充ValueFromOtherTable:

Select mt.*, ..., ot.ValueFromOtherTable from MyModelTable mt left 
join OtherTable ot ON (somecondition)

其中MyModelTable是映射到MyModel-class的表。我想通过从mt中选择所有值来填充ValueFromOtherTable(无NH映射)(以填充NH映射列),然后使用OtherTable我想填充ValueFromOtherTable。

我无法通过QueryOver加入这两个表,因为模型中没有直接的父子关联,因此JoinAliasJoinQueryOver不起作用。我的MainQueryOver次查询MyModelTable

ALTERNATIVE:

另一种方法是先从MyModelTable获取所有值,然后使用其中的属性查询OtherTable。但是,这会导致SELECT N+1问题(对于MyModel中的每个模型选择一些OtherTable ...)并且还会使代码变得非常复杂。

是否有一种解决此问题的好方法,或者是使用所述替代方法填充MyModel的唯一方法 ?

1 个答案:

答案 0 :(得分:2)

一种方法是使用Projections,Subquery和DTO。所以,让我们说,我们有DTO(几乎与MyModel相同,但有新的外部属性......例如Count)。然后我们可以这样做:

MyModel main = null;
MyModelDTO dto = null;

// the main query
var query = session.QueryOver<MyModel>(() => main);

// the subquery used for projection
var subquery = QueryOver.Of<OtherModel>()
    // select something, e.g. count of the ID
    .SelectList(selectGroup => selectGroup.SelectCount(o => o.ID))
    // some condition
    // kind of JOIN inside of the subquery
    .Where(o => o.xxx == main.yyy); // just example

// now select the properties from main MyModel and one from the subquery
query.SelectList(sl => sl
      .SelectSubQuery(subquery)
         .WithAlias(() => dto.Count)
      .Select(() => main.ID)
        .WithAlias(() => dto .ID)
      ....
    );

// we have to use transformer
query.TransformUsing(Transformers.AliasToBean<MyModelDTO >())

// and we can get a list of DTO
var list = query.List<MyModelDTO>();