1

我正在执行以下连接,有很多 bookingActions 记录,但我希望每个预订记录只有一个 BookingAction 记录。我想要具有最高主键值的 BookingAction 记录。

我该怎么做?

var bookingLocationsQuery = (
        from
            booking in session.Query<Booking>()
        join
            bookingActions in session.Query<BookingAction>() on booking.Id equals bookingActions.bookingId

        where
            (booking.bookingAdminID == userId)
        select new { booking, bookingActions }
    );
4

2 回答 2

2

几个建议。首先,您应该利用 NHibernatemany-to-one为您完成连接,而不是手动完成。看起来你目前有这样的事情......

public class BookingAction
{
    // ... other properties ...
    public virtual int bookingId { get; set; }
}
<class name="BookingAction">
    <!-- ... other properties ... -->
    <property name="bookingId" />
</class>

不要那样做。相反,您应该拥有:

public class BookingAction
{
    // ... other properties ...
    public virtual Booking Booking { get; set; }
}
<class name="BookingAction">
    <!-- ... other properties ... -->
    <many-to-one name="Booking" column="bookingId" />
</class>

类似的建议Booking.bookingAdminID。它应该是一个many-to-oneto User,而不仅仅是一个简单的属性。

其次,在你做出这些改变之后,你应该能够通过这样的查询来完成你的目标:

var subquery = session.Query<BookingAction>()
    .Where(a => a.Booking.Admin.Id == userId)
    .GroupBy(a => a.Booking.Id)
    .Select(g => g.Max(a => a.Id));

var bookingActions = session.Query<BookingAction>()
    .Fetch(a => a.Booking)
    .Where(a => subquery.Contains(a.Id));

很抱歉将其切换为链式扩展方法语法 - 这对我来说更容易使用。它完全等同from ... select于执行中的语法。

于 2013-08-15T21:52:02.970 回答
0

尝试使用该Max()方法,例如:

var bookingLocation = session.Query<Booking>()
                      .Where(booking => booking.bookingAdminID == userId)
                      .Max(x => booking.bookingAdminID);
于 2013-08-15T14:39:09.650 回答