您可以在原始集合上为分离条件创建限制吗?

时间:2013-10-18 21:53:11

标签: nhibernate primitive detachedcriteria restrictions

我想知道是否有办法在NHibernate.3.3.3中对模型的原始集合创建限制?

以下是详细信息:

class Parent { 
    IEnumerable<string> ChildNames { get; set; }

}

我需要像这样搜索:

private DetachedCriteria BuildQuery() {
    var inNames = { "Bob", "Sam", "Dan" };
    var query = DetachedCriteria.For<Parent>("parent");
    query.Add(Restrictions.In("ChildNames", inNames));
    return query;
}

我发现这个老问题说这是不可能的,但鉴于它已经老了而且没有大量的投票,我想在重构之前确认一下。

如果我能做到并且我完全拙劣,我也会接受这个帮助!

2 个答案:

答案 0 :(得分:0)

在这种情况下,我们可以使用Projection (更少类型安全,然后映射属性,但更灵活)

让我们期待这样的映射:

<bag name="ChildNames" inverse="false" lazy="true" table="[dbo].[ChildNames]" 
    cascade="all"
    batch-size="25">
  <key column="ParentId" />
  <element type="System.String" column="ChildName" />
</bag>

然后我们可以像这样调整Build查询方法:

protected virtual DetachedCriteria BuildQuery()
{
    var inNames = new [] { "Bob", "Sam", "Dan" };

    // parent query reference
    var query = DetachedCriteria.For<Parent>("parent");
    // reference to child query
    var child = query.CreateCriteria("ChildNames");

    // let's project the column name of the Element, e.g. 'Name'
    var columnNameProjection = Projections.SqlProjection(
        "ChildName as name", null, new IType[] { NHibernateUtil.String }
        );

    // in clause
    child.Add(Restrictions.In(
        columnNameProjection, inNames
        ));

    return query;
}

这就是我们将得到的:

SELECT ...
 FROM Parent this_ 
  inner join [dbo].[ChildNames] childNames3_ 
    on this_.ParentId=childNames3_.ParentId 
 WHERE ChildName in (@p0, @p1, @p2)
 ...
 @p0=N'Bob',@p1=N'Sam',@p2=N'Dan'

警告:

虽然这是在行动中... ChildName在没有别名的情况下使用。实现这可能非常棘手......所以请注意,如果在此方案中有更多名为ChildName的列

答案 1 :(得分:0)

我和许多人一样,最终将这个系列重构成一个强大的类型。