繁体   English   中英

nhibernate加入子查询

[英]nhibernate join on subquery

我正在尝试对另一个表的子查询进行联接,我具有以下实体:

public class SomeClass
{
    public virtual string KeyPart1 { get; set; }
    public virtual string KeyPart2 { get; set; }    
    public virtual int VersionNo { get; set; }
    public virtual string ClassProperty1 { get; set; }
    public virtual string ClassProperty2 { get; set; }
}

然后,我有以下查询以获取每个记录的最新版本:

var subquery = QueryOver.Of<SomeClass>()
                  .SelectList(lst => lst
                                .SelectGroup(f => f.KeyPart1)
                                .SelectGroup(f => f.KeyPart2)
                                .SelectMax(f => f.VersionNo));

我现在尝试为子查询的每个结果返回整个SomeClass。 到目前为止,我有这样的事情:

var query = QueryOver.Of<SomeClass>()
                 .WithSubquery.Where(???)

完成后,SQL语句应类似于以下内容

SELECT cls.*
FROM SomeClass as cls
INNER JOIN
   (SELECT KeyPart1, KeyPart2, MAX(VersionNo)
    FROM SomeClass
    GROUP BY KeyPart1, KeyPart2) as sub
ON sub.KeyPart1 = cls.KeyPart1 and sub.KeyPart2 = cls.KeyPart2 and sub.VersionNo = cls.VersionNo

有人可以帮我为每个最高版本返回整个SomeClass记录吗?

编辑:可以使用存在语句完成同一件事吗? 这将使我们能够使用类似:

SomeClass classAlias = null
var subquery = QueryOver.Of<SomeClass>()
                  .SelectList(lst => lst
                                .SelectGroup(f => f.KeyPart1)
                                .SelectGroup(f => f.KeyPart2)
                                .SelectMax(f => f.VersionNo))
                  .Where(x => x.KeyPart1 == classAlias.KeyPart1)
                  .Where(x => x.KeyPart2 == classAlias.KeyPart2)
                  .Where(x => x.VersionNo == classAlias.VersionNo)

var query = Session.QueryOver(() => classAlias)
               .WithSubQuery.WhereExists(subquery);

生成以下SQL语句:

SELECT *
FROM SomeClass cls
WHERE EXISTS
   (SELECT KeyPart1, KeyPart2, MAX(VersionNo)
    FROM SomeClass cls2
    WHERE cls.KeyPart1 = cls2.KeyPart1 and cls.KeyPart2 = cls2.KeyPart2 and cls.VersionNo = cls2.VersionNo
    GROUP BY KeyPart1, KeyPart2)

但是,这也带回了所有版本,但我认为这将是另一个不错的起点。

经过大量的试验和错误,我能够使用WHERE NOT EXISTS使它正常工作。 希望这会帮助有类似问题的人。

以下是将使用QueryOver返回特定记录的最新版本的代码段:

SomeClass classAlias = null
var subquery = QueryOver.Of<SomeClass>()
                  .SelectList(lst => lst
                                .SelectGroup(f => f.KeyPart1)
                                .SelectGroup(f => f.KeyPart2)
                                .SelectMax(f => f.VersionNo))
                  .Where(x => x.KeyPart1 == classAlias.KeyPart1)
                  .Where(x => x.KeyPart2 == classAlias.KeyPart2)
                  .Where(x => x.VersionNo > classAlias.VersionNo);

var query = Session.QueryOver(() => classAlias)
               .WithSubQuery.WhereNotExists(subquery);

var results = query.List();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM