如何从不同的表中的子查询中选择/投影值到我的主查询?
我有这样的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
加入这两个表,因为模型中没有直接的父子关联,因此JoinAlias
或JoinQueryOver
不起作用。我的MainQueryOver
次查询MyModelTable
。
ALTERNATIVE:
另一种方法是先从MyModelTable获取所有值,然后使用其中的属性查询OtherTable。但是,这会导致SELECT N+1
问题(对于MyModel
中的每个模型选择一些OtherTable ...)并且还会使代码变得非常复杂。
是否有一种解决此问题的好方法,或者是使用所述替代方法填充MyModel的唯一方法 ?
答案 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>();