gpt4 book ai didi

c# - QueryOver:从子查询中选择列

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:58 25 4
gpt4 key购买 nike

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

我有一个像这样的 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 连接两个表,因为模型中不存在直接的父子关系,所以 JoinAliasJoinQueryOver不会工作。我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com