Так что я люблю узнавать что-то новое о 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 и 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)
)