使用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)
)
类似于:
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);