【问题标题】:Nhibernate Join 2 QueryOver休眠加入 2 QueryOver
【发布时间】:2015-04-16 22:42:00
【问题描述】:

我找不到如何加入两个不同的 QueryOver、分组并在选择中执行减法。

说你有:

public class EntityA
{
    public virtual int Id;
    public virtual string Reference;
    public virtual int Quantity;
    [Some properties]
}

public class EntityB
{
    public virtual int Id;
    public virtual int EntityAId;
    [Some properties]
}

如果我用伪 SQL 翻译我的查询,我希望:

SELECT A.Id, A.Reference, A.Quantity - COALESCE(DERIV_B.TOTAL, 0)
FROM EntityA A
LEFT JOIN (
    SELECT B.EntityAId, COUNT(B.Id) AS TOTAL
    FROM EntityB B
    GROUP BY B.EntityAId) DERIV_B
ON A.Id = DERIV_B.EntityAId
WHERE (A.Quantity - COALESCE(DERIV_B.TOTAL, 0)) >= 0

我可以通过 QueryOver 在 EntityB 上进行子查询,但我无法加入 EntityA:

var entitiesB = GetCurrentSession().QueryOver<EntityB>().SelectList(select => select.SelectGroup(x => x.EntityAId).SelectCount(x => x.Id));

var entitiesA = GetCurrentSession().QueryOver<EntityA>(). ???

我尝试将实体 B 存储在别名中并对其执行 JoinAlias 但我有一个异常,因为它无法检索我的别名。

你有什么解决办法吗?

我不想在这两个实体之间创建引用。

【问题讨论】:

  • 幸运的是,答案非常简单:实体之间没有引用,没有 QueryOver 连接。您可以:更改您的域模型或使用本机 SQL 查询。

标签: nhibernate queryover


【解决方案1】:

简短的回答不是,如果你的实体没有通过模型连接,你不能做QueryOver。 一种解决方案是使用NHibernate.Linq 和子查询

var session = GetCurrentSession();
var entityBQuery = session.Query<EntityB>();
var entityAQuery = session.Query<EntityA>()
                          .Select(eA=>new { Id = eA.Id,
                                            Description = eA.Description,
                                            Quantity = eA.Quantity - entityBQuery.Where(eb=>eb.EntityAId = eA.Id).Count()
                                          }); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2016-03-15
    • 2013-05-22
    • 2018-07-16
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多