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)
就像是:
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)