2012-02-15 24 views
0

所以我喜歡學習關於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) 
    ) 
+0

可能重複:http://stackoverflow.com/questions/434138/how-to -set-more-than-2-expression-in-expression-or – 2012-02-15 20:14:53

+0

不,我看過,我能得到的只有Expression.Or需要兩件事來比較對方。我相信我想要的是限制一個字段等於一組數據中的一個項目。我沒有做比較。但我沒有花時間看分離。所以我會去看看。 – CSMHowitzer 2012-02-15 20:34:07

+0

我認爲Disjunction()是正確的道路上的一步,因爲我有一套項目,我想說的是像A或B或C ...但我添加了Expressions.Disjunction(),我仍然以相同的查詢。 – CSMHowitzer 2012-02-15 20:50:20

回答

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); 
+0

是的,這工作。太棒了,我非常感謝你的幫助。我所做的是我創建了一個分隔符,並在我的循環中添加了限制,然後我創建了我的列表(就像您的答案一樣)。查詢出現「SELECT * FROM TABLE1 INNER JOIN TABLE2 ON ID = ID WHERE COLOR = P0 AND(Window = P1 OR P2 .... PN)」感謝您的快速回復。 – CSMHowitzer 2012-02-16 13:45:34