nhibernate 加入子查询
nhibernate join on subquery
我正在尝试将一个子查询连接到另一个 table
我有以下实体:
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));
我现在正在尝试 return 整个 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
谁能帮我 return 每个最高版本的整个 SomeClass 记录?
编辑: 可以使用 exist 语句完成同样的事情吗?这将允许我们使用类似的东西:
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 return 特定记录的最新版本的代码片段:
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();
我正在尝试将一个子查询连接到另一个 table 我有以下实体:
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));
我现在正在尝试 return 整个 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
谁能帮我 return 每个最高版本的整个 SomeClass 记录?
编辑: 可以使用 exist 语句完成同样的事情吗?这将允许我们使用类似的东西:
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 return 特定记录的最新版本的代码片段:
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();