Комплексное соединение nHibernate - PullRequest
3 голосов
/ 22 июня 2010

Мне нужно выполнить сложное левое соединение для таблицы, и я не уверен, как написать код, используя запрос критерия. В настоящее время у меня есть:

 public IList<RezolutionConfig> GetSearchConfigByManagerCategoryProduct(int ManagerId, int ProductTypeId, int ConfigCategoryId)
    {
        ICriteria criteria = Session.GetISession().CreateCriteria(typeof(RezolutionConfig))
            .CreateAlias("RezolutionConfigCategory", "rcc")
            .Add(Expression.Eq("rcc.id", ConfigCategoryId))
            .CreateAlias("RezolutionProductType","rpt")
            .Add(Expression.Eq("rpt.id", ProductTypeId))
            .CreateAlias("RezolutionManagerConfigs", "rmc", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
            .CreateAlias("rmc.Manager", "m", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
            .Add(Expression.Eq("m.id", ManagerId));

        return criteria.List<RezolutionConfig>();
    }

, который производит:

ВЫБРАТЬ * FROM [dbo]. [RezolutionConfig] this_ внутреннее соединение [dbo]. [RezolutionConfigCategory] rcc1_ для этого _. [RezolutionConfigCategoryId] = rcc1 _. [RezolutionConfigCategoryId] внутреннее соединение [dbo]. [RezolutionProductType] rpt2_ для этого _. [RezolutionProductTypeId] = rpt2 _. [RezolutionProductTypeId] левое внешнее соединение [dbo]. [RezolutionManagerConfig] rmc3_ для этого _. [RezolutionConfigID] = rmc3 _. [RezolutionConfigID] левое внешнее соединение [dbo]. [Manager] m4_ на rmc3 _. [ManagerID] = m4 _. [ManagerID] ГДЕ rcc1 _. [RezolutionConfigCategoryId] = 1 и rpt2 _. [RezolutionProductTypeId] = 1 и m4 _. [ManagerID] = 9135

Что мне нужно сделать, это

ВЫБРАТЬ * FROM [dbo]. [RezolutionConfig] this_ внутреннее соединение [dbo]. [RezolutionConfigCategory] rcc1_ для этого _. [RezolutionConfigCategoryId] = rcc1 _. [RezolutionConfigCategoryId] внутреннее соединение [dbo]. [RezolutionProductType] rpt2_ для этого _. [RezolutionProductTypeId] = rpt2 _. [RezolutionProductTypeId] левое внешнее соединение [dbo]. [RezolutionManagerConfig] rmc3_ для этого _. [RezolutionConfigID] = rmc3 _. [RezolutionConfigID] левое внешнее соединение [dbo]. [Manager] m4_ на rmc3 _. [ManagerID] = m4 _. [ManagerID] и m4 _. [ManagerID] = 9135 ГДЕ rcc1 _. [RezolutionConfigCategoryId] = 1 и rpt2 _. [RezolutionProductTypeId] = 1

1 Ответ

0 голосов
/ 23 июня 2010

NHibernate не поддерживает добавление ограничения к объединению, как вы хотели бы: left outer join [dbo].[Manager] m4_ on rmc3_.[ManagerID]=m4_.[ManagerID] and m4_.[ManagerID] = 9135.Я думаю, что ваш лучший подход - написать запрос на HQL и использовать подзапрос, чтобы ограничить Manager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...