4

nHibernateを使用してレンダリングする必要のあるSQLクエリがあるとします。SQLクエリのWHERE句は、3つのORステートメントで構成され、各ORステートメントには条件のリストが含まれています。例えば:

SELECT * 
FROM MyTable 
WHERE
    (OrderId = 1 and ItemId = 100) 
    OR
    (OrderId = 2 and ItemId = 200)
    OR
    (OrderId = 3 and ItemId = 300)

nHibernateのCriteria構文を使用して、論理和を使用してこれを実装できます。

var disjunction = Restrictions.Disjunction();

foreach (var tuple in OrdersAndLineItems)
{
    var conjunction = Restrictions.Conjunction();
    var order = tuple.Item1;
    var lineitem = tuple.Item2;

    conjunction.Add(Restrictions.Eq("OrderId", order.Id));
    conjunction.Add(Restrictions.Eq("LineItemId", lineitem.Id));

    disjunction.Add(conjunction);
}

var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();

nHibernate 3.xのQueryOver構文を使用して同じタイプのクエリを作成するにはどうすればよいですか?

4

3 に答える 3

1

少なくともNHバージョン3.0.0.4000では、Addメソッドのオーバーロードが複数あります。それらの1つは、ケースに使用できる汎用パラメーターを持っていることです。次に例を示します。

disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1)
于 2013-10-17T09:16:07.497 に答える
0

同等性をテストする制限については、「場所」を使用します。例:

Restrictions.Where<SomeClass>(x => x.OrderId == order.Id)
于 2013-09-12T14:16:01.747 に答える
-3

気にしないでください-投稿した直後に、探していた答えを提供する以前のStackOverflowの投稿に出くわしました。これは、 QueryOver構文を使用して書き直された元の例です。

var disjunction = Restrictions.Disjunction();

foreach (var tuple in OrdersAndLineItems)
{
    var conjunction = Restrictions.Conjunction();
    var order = tuple.Item1;
    var lineitem = tuple.Item2;

    conjunction.Add(Restrictions.On<SomeClass>(x => x.OrderId).Equals(order.Id));
    conjunction.Add(Restrictions.On<SomeClass>(x => x.LineItemId).Equals(lineitem.Id));

    disjunction.Add(conjunction);
}

var result = Session.CreateCriteria<SomeClass>().Add(disjunction).ToList();
于 2012-12-12T10:45:46.040 に答える