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

CSM*_*zer 0 c# nhibernate nested sql-server-2008 criteria-api

所以我喜欢学习关于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)
    ) 
Run Code Online (Sandbox Code Playgroud)

这是我使用标准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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

从我寻找解决方案的一整天开始,我认为没有一种简单的方法可以明确地说"使这些表达式成为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)
    ) 
Run Code Online (Sandbox Code Playgroud)

Iri*_*ium 5

就像是:

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);
Run Code Online (Sandbox Code Playgroud)