#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. Пожалуйста :). Что касается вашего вопроса, он только один раз соединяется с языковой таблицей