Повторный запрос NHibernate с ограничением на объект, на который ссылается

#c# #nhibernate #properties #queryover #resolve

#c# #nhibernate #свойства #повторный запрос #разрешить

Вопрос:

Я использую Nhibernate с SQL server 2008.

Я пытаюсь выполнить следующий код:

         var localization = session.QueryOver<T>()
            .Where(idFilter).AndRestrictionOn(x => x.Language.IETFTag).IsLike(tag   "%").SingleOrDefault();
  

Однако в этой строке я получаю исключение, в котором говорится, что nhibernate не может разрешить язык свойств.IETFTag (или что-то в этом роде).

Я пытался использовать JoinQueryOver (), но затем он жалуется, что у меня есть несколько корреляций в предложении FROM или что-то странное в этом роде. Просто кажется, что я делаю что-то очень неправильное. Как я могу делать то, что я хочу?

У меня есть следующее сопоставление:

 internal class LocalizationMapping : ClassMap<Localization>
{
    public LocalizationMapping()
    {
        UseUnionSubclassForInheritanceMapping();
        Id(x => x.Id).GeneratedBy.HiLo("HiLo", "NextHi", "1000");
        References(x => x.Language);
    }
}

internal class LanguageMapping : ClassMap<Language>
{
    public LanguageMapping()
    {
        Id(x => x.Id);
        Map(x => x.DefaultName);
        Map(x => x.IETFTag);
    }
}

internal class ArticleLocalizationMapping : SubclassMap<ArticleLocalization>
{
    public ArticleLocalizationMapping()
    {
        Map(x => x.Name);
        Map(x => x.Description);
        References(x => x.Article);
    }
}
  

Ответ №1:

Вам необходимо предварительно выполнить объединение с таблицей «Language», используя псевдонимы. Полный запрос должен быть:

 Language language = null;

var localization = session.QueryOver<Localization>()
            .JoinAlias(x => x.Language, () => language)
            .Where(idFilter)
            .AndRestrictionOn(() => language.IETFTag).IsLike(tag, MatchMode.End)
            .SingleOrDefault();
  

Дополнительная информация на:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

Кроме того, метод «IsLike» принимает второй аргумент с соответствующим типом. Я взял на себя смелость обновить вашу инструкцию этим.

Комментарии:

1. Мне было нелегко решить ту же проблему несколько недель назад, и то, что вы предложили, сработало для меня.

2. Спасибо, чувак. 🙂 Проверка выражения приводит к несколько эзотерическому коду! Но красивый сам по себе. О чем я беспокоюсь, что это делает с моим SQL? Поскольку мне нужен псевдоним, означает ли это, что он присоединяется / выбирается два раза к языковой таблице?

3. Пожалуйста :). Что касается вашего вопроса, он только один раз соединяется с языковой таблицей