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

标签 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 类的表。我想通过从 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/

相关文章:

c# - WPF 的跨平台替代品

.net - 你如何启用 "Enable .NET Framework source stepping"?

.net - NHibernate 错误 - 在刷新之前保存 transient 实例

c# - 如何遍历 ArrayList 并将返回的对象转换为另一个对象

c# - 如何在 vscode 中访问 tasks.json 中的 .env 变量?

c# - 温控功能/算法

c# - 项目过期后无法将项目添加到内存缓存

.net - ElasticSearch.NET 连接/客户端管理生命周期

c# - 我如何让 NHibernate 进行连接?

c# - 流畅的 nHibernate 配置