使用NHibernate Criteria API创建嵌套OR语句

本文关键字:嵌套 OR 语句 创建 API NHibernate Criteria 使用 | 更新日期: 2023-09-27 18:24:57

所以我喜欢学习关于NHibernate的新东西,因为它确实非常灵活,让我的生活变得轻松,除了我现在所处的位置;)。到目前为止,我还没有做过非常复杂的查询,这一次也不复杂,但我觉得最常用的方法和对象类型无法解决这个问题。

以下是我想查询的内容:

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID 
WHERE _Table1.ColorID= @param0
AND (
      _Table2.WindowID = @param1 OR
      _Table2.WindowID = @param2 OR
      _Table2.WindowID = @param3 OR
      ................ = @param(N - 1)
    ) 

这是我使用API 标准得到的

private IList<Table1Entity> FetchListByWindowId(int colorID, List<int> listOfWindowIDs)
{
    var list = CurrentSession.CreateCriteria<Table1Entity>()
                 .Add(Restrictions.Eq("ColorID", colorID))
                 .CreateCriteria("Table2EntityList");
    foreach (var item in listOfWindowIDs)
    {
        list.GetCriteriaByPath("Table2EntityList")
            .Add(Restrictions.Eq("WindowID", Int32.Parse(item)
    }
}

表1的映射包括4个属性UserID、ColorID、AppID和到Table2实体的HasMany。

HasMany<Table2Entity>(x => x.Table2EntityList)
     .KeyColumns.Add("AppID")
     .Not.LazyLoad()
     .Inverse()
     .Cascade.None();

从我花了一整天的时间寻找解决方案开始,我认为没有一种简单的方法可以明确地说"让这些表达式OR"(是的,我看过Expression.OR,这不是我想要的)。

NHibernate给我的查询正是我想要的,只是我需要用"OR"替换一些"AND"

谢谢,如果这件事很琐碎,我很抱歉。我也想为我的代码的模糊性道歉,但我处理的是敏感数据。因此,所有变量名和方法名等都必须进行调整。

编辑:NHibernate目前给我的查询:

SELECT _Table1.UserID, _Table1.ColorID, _Table1.AppID FROM _Table1
INNER JOIN _Table2 ON _Table2.AppID = _Table1.AppID 
WHERE _Table1.ColorID= @param0
AND (
      _Table2.WindowID = @param1
      AND _Table2.WindowID = @param2 
      AND _Table2.WindowID = @param3
      AND ................ = @param(N - 1)
    ) 

使用NHibernate Criteria API创建嵌套OR语句

类似于:

var disjunction = new Disjunction()
    .Add(Restriction.Eq("WindowID", item1))
    .Add(Restriction.Eq("WindowID", item2))
    .Add(Restriction.Eq("WindowID", item3));
// Or use a loop if you like...
var list = CurrentSession.CreateCriteria<Table1Entity>()
    .Add(Restrictions.Eq("ColorID", colorID))
    .CreateCriteria("Table2EntityList")
    .Add(disjunction);