【问题标题】:Distinct over one column with value comparing on another column ICriteria NHibernate在一列上区分,在另一列上比较值 ICriteria NHibernate
【发布时间】:2013-06-17 11:07:19
【问题描述】:

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

  • 约翰·史密斯,52 岁
  • 杰西卡·史密斯,45 岁
  • 安皮特,21 岁
  • 布拉德皮特,30

谁能帮我创建标准,结果我得到了 John Smith 和 Brad Pit 的 Person 对象?

【问题讨论】:

  • 如果 BOTH John 和 Jessica Smith 恰好是 52 岁,结果集中是什么?
  • 没关系。它可以返回 John 或 Jessica
  • 当然很重要,根据其他条件,您希望两者都返回还是只返回其中一个?
  • 只有其中之一。对我来说,哪一个都无所谓。只用姓氏计算我最老的。

标签: nhibernate distinct criteria


【解决方案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>();

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多