-1

我目前正在尝试获取一组客户的订单列表并找到每个客户的最后一个订单,检查该订单上的项目并将其与 NHibernate 中的字符串列表进行比较。但是我完全被难住了当我使用 NHibernate 1.2(我无法升级它)时,我如何才能让客户找到他们的最后订单日期。所以我无法访问较新版本中的 LINQ 功能。

如果有人能指出我正确的方向,那就太棒了,到目前为止,我有这个。

IList<Order> people = new List<Order>();
ICriteria criteria = CoreHttpModule.Session.CreateCriteria(typeof(Order));
string[] instrumentList = { "Item1", "Item2", "Item3" };

public void CleanList()
{
    criteria.CreateAlias("Customer", "customer", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
    criteria.CreateAlias("Purchaser", "purchaser", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
    criteria.CreateAlias("Agent", "agent", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
}
4

1 回答 1

0

首先,您在 SQL 中构建查询:

SELECT O.* 
    FROM Orders order1
    INNER JOIN Customers customer1 ON customer1.ID = order1.CustomerId
    WHERE EXISTS (
        SELECT TOP 1 ID FROM Orders order2 
            INNER JOIN Customers customer2 ON customer2.Id = order2.CustomerId
            WHERE customer2.Id = customer1.Id 
            ORDER BY order2.OrderDate DESC
    )

然后你尝试在 NHibernate 中构建相同的查询

DetachedCriteria dc = DetachedCriteria.For(typeof(Order), "order2")
    .CreateAlias("Customer", "customer2", JoinType.InnerJoin)
    .Add(Restrictions.EqProperty("customer2.ID", "customer1.ID"))
    .AddOrder(NHibernate.Criterion.Order.Desc("order2.OrderDate"))
    .SetProjection(Projections.Property("order2.ID"))
    .SetMaxResults(1);

ICriterion condition = Subqueries.Exists(dc);

ICriteria criteria = Session.CreateCriteria(typeof(Order), "order1")
    .CreateAlias("Customer", "customer1", JoinType.InnerJoin)
    .Add(condition);

NHibernate 唯一的大限制是您不能动态创建 JOIN:您只能在映射文件中加入的表(和字段)上进行 JOIN。

请注意,这是Order首先使用 s 构建的,因此Customer没有Orders 的 s 不会“出现”。

您必须更改字段名称。

于 2013-09-11T10:14:34.917 回答