与另一列ICriteria NHibernate上的值比较,在一列上区别

时间:2013-06-17 11:07:20

标签: nhibernate distinct criteria

我有一个名为Person的表和对象。我有问题要创建一个独特的(超过列“姓氏”)标准。我想只获得具有不同姓氏的最老的人。 例如我有(属性:名字,姓氏,年龄):

  • John Smith,52
  • Jessica Smith,45
  • Ann Pit,21
  • Brad Pit,30

任何人都可以帮我创建标准,结果我得到John对象和Brad Pit的Person对象吗?

1 个答案:

答案 0 :(得分:1)

这里最好的方法可能是使用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>();