我有名为 Person 的表和对象。我无法创建一个不同的(超过列“姓氏”)标准。我只想获得姓氏不同的最古老的人。例如我有(属性:名字,姓氏,年龄):
- 约翰史密斯,52 岁
- 杰西卡·史密斯,45 岁
- 安皮特,21
- 布拉德皮特,30
任何人都可以帮助我创建标准,结果我得到 John Smith 和 Brad Pit 的 Person 对象吗?
我有名为 Person 的表和对象。我无法创建一个不同的(超过列“姓氏”)标准。我只想获得姓氏不同的最古老的人。例如我有(属性:名字,姓氏,年龄):
任何人都可以帮助我创建标准,结果我得到 John Smith 和 Brad Pit 的 Person 对象吗?
可能这里最好的方法是使用 EXISTS 来过滤结果集,首先是一个 SQL 示例来获得正确的逻辑:
DECLARE @Person TABLE (
Id INT,
Firstname VARCHAR(20),
Lastname VARCHAR(20),
Age INT
)
INSERT INTO @Person VALUES (1, 'Brad', 'Pitt', 42)
INSERT INTO @Person VALUES (2, 'Angelina', 'Pitt', 45)
INSERT INTO @Person VALUES (3, 'John', 'Smith', 50)
INSERT INTO @Person VALUES (4, 'Jane', 'Smith', 55)
SELECT P.* FROM @Person P
WHERE EXISTS(
SELECT SUB.LastName, MAX(SUB.Age) as Age FROM @Person SUB
GROUP BY SUB.LastName
HAVING SUB.LastName = P.LastName AND MAX(SUB.Age) = P.Age)
这会产生以下结果,正如预期的那样:
Id Firstname Lastname Age
-------------------------------
2 Angelina Pitt 45
4 Jane Smith 55
现在转换为 nHibernate,这有效地构建了与上面相同的查询:
var subQuery = DetachedCriteria.For<Person>("SUB")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("LastName"), "Lastname")
.Add(Projections.Max("Age"), "Age"))
.Add(Restrictions.EqProperty(Projections.Max("Age"), "P.Age")
.Add(Restrictions.EqProperty("LastName", "P.LastName"));
return session.CreateCriteria<Person>("P")
.Add(Subqueries.Exists(subQuery))
.List<Person>();