NHibernate查询,对引用的实体有限制

Max*_*Max 3 c# nhibernate properties resolve queryover

我正在使用Nhibernate与SQL Server 2008.

我正在尝试执行以下代码:

        var localization = session.QueryOver<T>()
            .Where(idFilter).AndRestrictionOn(x => x.Language.IETFTag).IsLike(tag + "%").SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

但是,我在该行上得到一个异常,说nhibernate无法解析属性Language.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

pso*_*usa 8

您需要先使用别名连接到"语言"表.完整的查询应该是:

Language language = null;

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

更多信息请访问:http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

此外,"IsLike"方法接受具有匹配类型的第二个arg.我冒昧地用它来更新你的指令.