-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 されたテーブル (およびフィールド) でのみ JOIN できます。

これはOrder最初に s で構築されるため、Customers のないOrders は「表示」されないことに注意してください。

フィールド名を変更する必要があります。

于 2013-09-11T10:14:34.917 に答える