【问题标题】:projection property in subquery nhibernate criteria子查询休眠条件中的投影属性
【发布时间】:2015-11-16 16:12:47
【问题描述】:

这是交易,我有 2 张桌子:

table (A) with columns ( colA_1  | colA_2 | colA_ID ) <br>
table (B) with columns ( colB )

我正在使用DetachedCriteria.For&lt;AnyEntity&gt;() 来查询 SQL。

目的是得到一个这样的sql:

Select A.colA_ID from A 
where (CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10))) 
in (select colB from B)

提前感谢您的帮助

【问题讨论】:

    标签: sql nhibernate criteria projection restrictions


    【解决方案1】:

    我强烈建议在您的 A 实体上创建一个特殊属性:

    public class EntityA
    {
        ...
        public virtual string ProjectedKey { get; set; } 
    }
    

    并使用公式将其映射为只读

    <property name="ProjectedKey" 
              formula="(CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10)))" 
              insert="false" update="false" />
    

    现在很容易使用子查询

    // subquery to get colB (its id?) from table B
    var detachedQuery = DetachedCriteria.For<EntityB>()    
         .SetProjection(Projections.Id()) // or property representing col B
    
    // use subquery with property represented by formula
    var rootQuery = session.CreateCriteria<EntityA>()
         .Add(Subqueries.PropertyIn("ProjectedKey", detachedQuery));
    

    【讨论】:

    • 感谢 Radim,该解决方案适用于我发布的简单问题,但真正的问题比我写的要复杂。我试图适应我的情况,但我没有到达那里。想象在 (CAST(colA_1 AS VARCHAR(10)) + CAST(colA_2 AS VARCHAR(10))) 我不想要 colA_2 但我想要表 C 中的 colC_2。这是因为我在 EntityA 中有一个复合键在您的解决方案中定义
    • 这太复杂了。这种情况超出了 ORM 工具的能力。它不是为解决非标准密钥而设计的。即使从数据库的角度来看,这样的查询也是最无效的。我希望能够在这里为您提供 NHibernate 的一般解决方案......但唯一的方法是修复 DB 设计。严重地。您现在或以后可以这样做,但我的经验表明:别无他法……对不起。无论如何,祝 NHibernate 好运 ;)
    • 再次感谢 Radim,我设法使用公式参数来实现我想要的,例如 http://stackoverflow.com/questions/13114619/using-a-property-mapping-with-a-formula-in-nhibernate 但缺点是纯 sql 的混合会破坏 c# 模型和数据库。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2018-08-04
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多