Создание вложенного оператора OR с помощью API NHibernate Criteria - PullRequest
0 голосов
/ 15 февраля 2012

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

1 Ответ

5 голосов
/ 16 февраля 2012

Что-то вроде:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...