【问题标题】:nHibernate: Conjunctions and Disjunctions using QueryOvernHibernate:使用 QueryOver 的连接和析取
【发布时间】:2012-12-12 09:58:45
【问题描述】:

假设我有一个需要使用 nHibernate 呈现的 SQL 查询。 SQL 查询的WHERE 子句由三个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 语法编写相同类型的查询?

【问题讨论】:

    标签: nhibernate nhibernate-criteria queryover


    【解决方案1】:

    至少在 NH 版本 3.0.0.4000 中有多个 Add 方法的重载。其中之一是具有可用于您的案例的通用参数,例如:

    disjuction.Add<TypeinWhichPrimaryKeyPropertyExists>(x => x.PrimaryKey == 1)
    

    【讨论】:

      【解决方案2】:

      对于要测试相等性的限制,请使用“Where”,例如:

      Restrictions.Where<SomeClass>(x => x.OrderId == order.Id)
      

      【讨论】:

        【解决方案3】:

        没关系——我在发布后不久偶然发现了an earlier StackOverflow post,它提供了我正在寻找的答案。这是我使用 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();
        

        【讨论】:

        • 这是不正确的。 Equals 是对象上的方法,与 QueryOver API 无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多