【问题标题】:NHibernate Lambda Extensions can't use any alias query on DetachedCriteriaNHibernate Lambda 扩展不能在 DetachedCriteria 上使用任何别名查询
【发布时间】:2010-03-15 17:12:15
【问题描述】:

我正在尝试编写一个需要别名的简单查询,因为它是多对多关联,但是我无法让它与 NH Lambda 扩展一起使用。它总是给我一个编译错误,尽管据我所知它与文档和我在网上看到的所有示例完全相同。

作品

var query = DetachedCriteria.For<County>()            
    .CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    //.CreateCriteria<County>(x => x.Zips, 
    //                              () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

不起作用

var query = DetachedCriteria.For<County>()            
    //.CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    .CreateCriteria<County>(x => x.Zips, 
                                    () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

生成Error 22 The name 'zipAlias' does not exist in the current context

Intellisense 还突出显示 CreateCriteria**&lt;County&gt;** 说它不理解该方法,但是当我在括号内时它确实正确地向我显示了参数名称。

【问题讨论】:

    标签: c# nhibernate detachedcriteria nhlambdaextensions


    【解决方案1】:

    documentation 充满了方便的示例。

    您的zipAlias 需要是本地范围内的变量。

    Zip zipAlias = null;
    string zipCode = "";
    
    var query = DetachedCriteria.For<County>()
        .CreateCriteria<County>(x => x.Zips, () => zipAlias, JoinType.LeftOuterJoin)
        .Add<Zip>(zip => zip.ZipCode == zipCode);
    

    由于文档链接下载而不是渲染,我复制了一些部分。

    创建与别名的条件关联
    使用原始 ICriteria API:

    ICriteria before = CreateSession()
        .CreateCriteria(typeof(Person))
            .CreateCriteria("Children", "childAlias")
                .Add(Restrictions.Eq("Nickname", "test"));
    

    使用 NHibernate Lambda 扩展:

    Child childAlias = null;
    ICriteria after = CreateSession()
        .CreateCriteria(typeof(Person))
            .CreateCriteria((Person p) => p.Children, () => childAlias)
                .Add<Child>(c => c.Nickname == "test");
    

    使用别名和连接类型创建条件别名关联
    使用原始 ICriteria API:

    ICriteria before = CreateSession()
        .CreateCriteria(typeof(Person), "personAlias")
            .CreateCriteria("personAlias.Children", "childAlias", JoinType.LeftOuterJoin)
                .Add(Restrictions.Eq("Nickname", "test"));
    

    使用 NHibernate Lambda 扩展:

    Person personAlias = null;
    Child childAlias = null;
    ICriteria after = CreateSession()
        .CreateCriteria(typeof(Person), () => personAlias)
            .CreateCriteria(() => personAlias.Children, () => childAlias, JoinType.LeftOuterJoin)
                .Add<Child>(c => c.Nickname == "test");
    

    使用别名和联接类型创建条件关联
    使用原始 ICriteria API:

    DetachedCriteria before =
        DetachedCriteria.For<Person>()
            .CreateCriteria("Children", "childAlias", JoinType.LeftOuterJoin)
                .Add(Restrictions.Eq("Nickname", "test"));
    

    使用 NHibernate Lambda 扩展:

    Child childAlias = null;
    DetachedCriteria after =
        DetachedCriteria.For<Person>()
            .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
                .Add<Child>(c => c.Nickname == "test");
    

    【讨论】:

    • 嗯,这很不直观,当我查看.For&lt;&gt; 之后发生的事情时,我什至没有看到其中有变量声明
    • Child 数据类型驻留在哪个命名空间中?我好像没找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多