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)
}
}
表1のマッピングが4つのプロパティユーザーID、ColorID、のAppIDを含んを使用しているもので、およびHasManyをTable2エンティティに追加します。私は解決策、私は明示的に(はい、私はExpression.ORを見ている「これらの式を作るか」と言うための簡単な方法があるとは思わない探しに入れてきたフル日から
HasMany<Table2Entity>(x => x.Table2EntityList)
.KeyColumns.Add("AppID")
.Not.LazyLoad()
.Inverse()
.Cascade.None();
それは私が望むものではない)。
NHibernateのは、私に与えているクエリは正確に私は、これは非常に些細であることが判明した場合、「論理和」
おかげで、と申し訳ありませんと、いくつかの「論理積」を交換する必要があることを除いて欲しいものです。コードの漠然としたことをお詫びしたいと思いますが、私は機密データを扱います。したがって、すべての変数名やメソッド名などを調整する必要がありました。
EDIT: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-expression-in-expressionまたは –
いいえ、私はそれを見ましたが、私が得ることができるのはExpression.Orです。私が望むのは、データセット内のアイテムとフィールドが等しいことを制限することです。私は比較をしていない。しかし、私はDisjunctionを見るのに時間を費やしていません。だから私はそれを見に行きます。 – CSMHowitzer
私はアイテムのセットを持っているので、Disjunction()は正しい道の一歩だと思うし、AやBやCのようなものを言いたいのですが...しかし、私はExpressions.Disjunction()を追加しました。同じクエリ。 – CSMHowitzer