在这种情况下,我们可以使用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>
然后我们可以像这样调整构建查询方法:
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
在这种情况下有更多的列名称