听起来您可以使用过滤器来执行此操作。
首先,您需要定义过滤器类型
public class SpecificCategoryFilter : FilterDefinition
{
public SpecificCategoryFilter()
{
WithName("SpecificCategory").WithCondition("Category = 'A constant expression'");
}
}
public class SpecificLanguageFilter : FilterDefinition
{
public SpecificLanguageFilter()
{
WithName("SpecificLanguage").WithCondition("Language = 'A constant expression'");
}
}
已编辑:根据评论,没有.ApplyFilter<TFilter>()
on References()
,所以更新了我认为使用过滤器的方法
过滤器需要在流畅的映射中应用
public class Table2Map : ClassMap<Table2>
{
public Table2Map()
{
// Other mappings here...
ApplyFilter<SpecificCategoryFilter>();
ApplyFilter<SpecificLanguageFilter>();
}
}
最后,当您打开会话时,您需要启用过滤器
using (var session = sessionFactory.OpenSession())
{
session.EnableFilter("SpecificCategory");
session.EnableFilter("SpecificLanguage");
}
如果您正在使用 的实现ICurrentSessionContext
并且过滤器应该始终应用,那么您可以在从调用返回的会话中启用过滤器ICurrentSessionContext.CurrentSession()
。
现在,在查询 时Table1
,为了激活过滤器Table2
,您需要指示 NHibernate 加入到引用的Table2
; 你可以使用
Fetch(t => t.Table2).Eager
JoinQueryOver(t => t.Table2)
(以及类似的加入策略)
在没有指示 NHibernate 进行连接的情况下,默认情况下会延迟加载引用,因此不会在查询中应用过滤器。缺点是Table2
会急切地获取,但我不知道以其他方式应用过滤器的方法。以下查询
session.QueryOver<Table1>().Inner.JoinQueryOver(t => t.Table2).List();
结果类似于 SQL
SELECT
this_.Id as Id0_1_,
this_.Table2Id as Table3_0_1_,
table2_.Id as Id1_0_,
table2_.Category as Category1_0_,
table2_.Language as Language1_0_
FROM
Table1 this_
inner join
Table2 table2_
on this_.Table2Id=table2_.Id
WHERE
table2_.Category = 'A constant expression'
and table2_.Language = 'A constant expression'
这类似于您在问题中遇到的 SQL。