【问题标题】:Sorting a list by last order date按最后订购日期对列表进行排序
【发布时间】:2023-03-21 20:17:01
【问题描述】:

我目前正在尝试获取一组客户的订单列表并找到每个客户的最后一个订单,检查该订单上的项目并将其与 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);
}

【问题讨论】:

  • 您可以先给我们一些例子,说明Order、Customer、Purchasers、Agent 对象是如何连接的。我什至没有看到你所说的Customers 集。只有一个instrumentList
  • 抱歉,这个工作原理基本上是 Order 是一个完整的订单信息表,其中包含有关它的完整信息,其他三个通过 customer_id 连接到它
  • 通常您首先编写所需的 SQL 查询,然后将其转换为 NHibernate。条件查询几乎 1:1 映射到 SQL 查询。

标签: c# sql nhibernate


【解决方案1】:

首先在 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 的表(和字段)上进行 JOIN。

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

您必须更改字段名称。

【讨论】:

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