0

如何表达查询

    Select * from
        (select name, Max(date) as date from items group by name) as latest
    inner join items as i
        on i.name=latest.name and i.date = latest.date

在 NHibernate 的 QueryOver 语法中?

因此,我希望从 items 表中获取每个名称的最大日期记录。

表中的每个项目对应于ItemEnity类:

[Class(Table = "items")]
public class ItemEnity
{
    [Id(Name = "Id")]
    [Generator(1, Class = "native")]
    public virtual long Id { get; set; }

    [Property(NotNull = true)]
    public virtual string Name { get; set; }

    [Property(NotNull = true)]
    public virtual DateTime Date { get; set; }

    // other columns ... 
}

我设法以强类型形式表达子查询:

public class ItemLatest
{
    public string Name { get; set; }
    public DateTime Date { get; set; }
}

// ...

ItemLatest latest = null;

var subquery = QueryOver.Of<ItemEntity>().SelectList(list => list
    .SelectGroup(i => i.Name).WithAlias(() => latest.Name)
    .SelectMax(i => i.Date).WithAlias(() => latest.Date))
    .TransformUsing(Transformers.AliasToBean<ItemLatest>());

var result = subquery.GetExecutableQueryOver(session).List<ItemLatest>();

但是我不知道如何编写连接,因为我不知道如何使用JoinQueryOver()来表示两个实体(在我的情况下为 ItemLatest 和 ItemEnity)之间的连接,这两个实体之间没有相互引用的关系属性。

4

1 回答 1

1

JOIN 是通过映射定义的 ORM 世界(包括 NHibernate) 。因此,如果您想使用条件和 JOIN,它必须在 Referenced 属性之上。

例如,我们可以做的是创建一个新对象,例如ItemEnityMaxDate并将其映射到类似于您的 SELECT MAX .. GROUP BY 的视图。我们可以像这样扩展它,例如:

SELECT main.Id, main.Name, main.Date
  FROM items  main
    INNER JOIN 
    (
      SELECT i.Name, Max(i.Date) AS Date FROM items i GROUP BY i.Name 
    ) AS latest
    ON main.Name = latest.Name AND main.Date = latest.Date

C#ItemEnityMaxDate将类似于ItemEntity(我们只需要 Id),映射到上面的视图。然后我们可以将其用作子查询

// inner select
var subquery = DetachedCriteria.For<ItemEnityMaxDate>()
    .SetProjection(Projections.Property("Id"));

// the ItemEntity
var query = session.CreateCriteria<ItemEntity>()
    .Add(Subqueries.PropertyIn("Id", subquery));
var list = query.List<ItemEntity>();

这可能不是唯一的方法。但是通过这种方式,将您的“特殊查询”表示为一个对象......会起作用

于 2013-08-21T18:19:44.220 回答