如何从不同表的子查询中选择/投影值到我的主查询中?
我有一个像这样的 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 类的表。我想通过从 mt 中选择所有值(以填充 NH 映射列)来填充 ValueFromOtherTable(无 NH 映射),然后使用 OtherTable 我想填充 ValueFromOtherTable。
我无法通过 QueryOver
连接两个表,因为模型中不存在直接的父子关系,所以 JoinAlias
或 JoinQueryOver
不会工作。我的 MainQueryOver
查询 MyModelTable
。
备选方案:
另一种方法是先从 MyModelTable 中获取所有值,然后使用那里的属性来查询 OtherTable。然而,这将导致 SELECT N+1
问题(对于来自 MyModel
的每个模型,选择一些 OtherTable...)并且还会使代码变得非常复杂。
是否有解决此问题的好方法,或者是使用描述的替代方法填充 MyModel 的唯一方法 ?
最佳答案
一种方法是使用投影、子查询和 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>();
关于c# - QueryOver:从子查询中选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26213519/