所以我喜歡學習關於NHibernate的新東西,因爲它真的非常靈活,並且使我的生活變得很簡單,除了我現在被卡住的地方;)。到目前爲止,我不必做非常複雜的查詢,而且這個查詢也不復雜,但我覺得最常用的方法和對象類型不會覆蓋這個問題。使用NHibernate Criteria API創建一個嵌套的OR語句
這是我要查詢的內容:
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)
}
}
爲表一個映射包括4個屬性的用戶ID,ColorID,的AppID,和一個HasMany到Table2實體。
HasMany<Table2Entity>(x => x.Table2EntityList)
.KeyColumns.Add("AppID")
.Not.LazyLoad()
.Inverse()
.Cascade.None();
從整天我已經投入到尋找解決的辦法,我不認爲有一個簡單的方法來明確地說:「讓這些表達式或」(是的,我已經看過Expression.OR和這不是我想要的)。
查詢NHibernate的是給我的正是我想除了我需要「手術室」
感謝,並遺憾地更換一些「與運算」如果這被證明是很瑣碎的東西。我也想爲我的代碼的模糊性道歉,但是我處理敏感數據。所以所有的變量名稱和方法名稱等都必須進行調整。
編輯: 的查詢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)
)
可能重複:http://stackoverflow.com/questions/434138/how-to -set-more-than-2-expression-in-expression-or – 2012-02-15 20:14:53
不,我看過,我能得到的只有Expression.Or需要兩件事來比較對方。我相信我想要的是限制一個字段等於一組數據中的一個項目。我沒有做比較。但我沒有花時間看分離。所以我會去看看。 – CSMHowitzer 2012-02-15 20:34:07
我認爲Disjunction()是正確的道路上的一步,因爲我有一套項目,我想說的是像A或B或C ...但我添加了Expressions.Disjunction(),我仍然以相同的查詢。 – CSMHowitzer 2012-02-15 20:50:20