NHibernate:为每个父级选择子集合中按日期排序的前1位

时间:2011-05-17 23:25:37

标签: nhibernate

我有一个Client类和一个Meeting类,我正在尝试检索每个客户端的所有下一次会议。所以我最终会为每个客户召开一次会议。

我最终得到这样的查询:

var qry = from client in session.Query<Client>()
          select new
          {
              c = client,
              e = client.Meetings.OrderBy(x => x.Date).First()
          };

生成的sql是:

select
    client0_.ClientId as col_0_0_,
    (select 
        meetings1_.EventId 
    from
        Event meetings1_ 
    where
        client0_.ClientId=meetings1_.ClientId
    order by
        meetings1_.Date asc) as col_1_0_,
    client0_.ClientId as ClientId13_,
    client0_.ContactName as ContactN2_13_,
    client0_.ClientStatus as ClientSt3_13_,
    client0_.HomePhoneNumber as HomePhon4_13_,
    client0_.FaxNumber as FaxNumber13_,
    client0_.WorkPhoneNumber as WorkPhon6_13_,
from
    Client client0_

我期待子查询有一个前1但它没有,这是Linq对NHibernate的问题还是我做错了什么?

2 个答案:

答案 0 :(得分:0)

我不知道这是否有效,但值得一试:

Session.Linq<Meeting>().OrderByDescending(x => x.DateOfMeeting).Distinct();

答案 1 :(得分:0)

我正在尝试做同样的事情。

我尝试在我的映射中使用一个公式,当我可以限制返回的行没有top 1或rownum = 1时(如果行中的列的状态可以使用:如何,HasMeetingOccured = null,但显然对于这种无效的情况。)

对我来说 - Oracle抛出了语法 - 无论出于什么原因它不喜欢子查询中的rownum限制 - 它以某种方式打破了语法。

我没有尝试过使用linq提供程序,也不知道如何在critiera API中执行此操作..但是,Single()或Take(1)是否有效?