Sql 子查询nhibernate条件中的投影属性

Sql 子查询nhibernate条件中的投影属性,sql,nhibernate,criteria,projection,restrictions,Sql,Nhibernate,Criteria,Projection,Restrictions,交易是这样的,我有两张桌子: table (A) with columns ( colA_1 | colA_2 | colA_ID ) <br> table (B) with columns ( colB ) 提前感谢您的帮助我强烈建议您在a实体上创建一个特殊属性: public class EntityA { ... public virtual string ProjectedKey { get; set; } } 并使用公式将其映射为只读 <pro

交易是这样的,我有两张桌子:

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

提前感谢您的帮助

我强烈建议您在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));
//从表B获取colB(其id?)的子查询
var detachedQuery=DetachedCriteria.For()
.SetProjection(Projections.Id())//或表示列B的属性
//使用具有由公式表示的属性的子查询
var rootQuery=session.CreateCriteria()
.Add(subquerys.PropertyIn(“ProjectedKey”,detachedQuery));

我强烈建议您在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));
//从表B获取colB(其id?)的子查询
var detachedQuery=DetachedCriteria.For()
.SetProjection(Projections.Id())//或表示列B的属性
//使用具有由公式表示的属性的子查询
var rootQuery=session.CreateCriteria()
.Add(subquerys.PropertyIn(“ProjectedKey”,detachedQuery));

谢谢Radim,解决方案适用于我发布的简单问题,但真正的问题比我写的更复杂。我试着让它适应我的情况,但我没有做到。假设在(CAST(colA_1作为VARCHAR(10))+CAST(colA_2作为VARCHAR(10)))中,我不想要colA_2,但我想要表C中的colC_2。这是因为我在EntityA中有一个复合键,正如您在解决方案中定义的那样,这太复杂了。这样的场景超出了ORM工具的能力。它不是为解决非标准密钥而设计的。即使从数据库的角度来看,这样的查询也是最无效的。我希望能在这里为您提供NHibernate的通用解决方案。。。但唯一的方法是修复DB设计。认真地你可以现在或以后做,但我的经验告诉我:没有其他方法。。。很抱歉不管怎样,祝你和NHibernate好运;)再次感谢Radim,我成功地使用公式参数实现了我想要的,例如这里的例子,但缺点是纯sql的混合将打破c#模型和DB之间完整性的优势。感谢Radim,解决方案适用于我发布的简单问题,但实际问题比我写的更复杂。我试着让它适应我的情况,但我没有做到。假设在(CAST(colA_1作为VARCHAR(10))+CAST(colA_2作为VARCHAR(10)))中,我不想要colA_2,但我想要表C中的colC_2。这是因为我在EntityA中有一个复合键,正如您在解决方案中定义的那样,这太复杂了。这样的场景超出了ORM工具的能力。它不是为解决非标准密钥而设计的。即使从数据库的角度来看,这样的查询也是最无效的。我希望能在这里为您提供NHibernate的通用解决方案。。。但唯一的方法是修复DB设计。认真地你可以现在或以后做,但我的经验告诉我:没有其他方法。。。很抱歉不管怎样,祝你和NHibernate好运;)再次感谢Radim,我成功地使用公式参数实现了我想要的,例如这里的示例,但缺点是混合使用纯sql,这将打破c#模型和DB之间的完整性优势。