好的,这将采取一些步骤,请多多包涵。我在这里假设使用SQL Server,但说明应适用于支持
checksum1的任何方言:
创建支持该
checksum
功能的自定义方言:public class MyCustomDialect : MsSql2008Dialect
{
public MyCustomDialect()
{
RegisterFunction(“checksum”, new SQLFunctionTemplate(NHibernateUtil.Int32, “checksum(?1, ?2)”));
}
}更新配置以使用自定义方言(您可以在配置XML文件中或使用代码来执行此操作。有关更多信息,请参见此答案。这是我在现有配置代码中执行的操作:
configuration.Configure(@"hibernate.cfg.xml").DatabaseIntegration( db => db.Dialect<MyCustomDialect>());
创建一个调用的自定义投影
checksum
。此步骤是可选的-您可以根据需要Projections.SqlFunction
直接调用,但是我认为将其重构为一个单独的函数更为简洁:public static class MyProjections
{
public static IProjection Checksum(params IProjection[] projections)
{
return Projections.SqlFunction(“checksum”, NHibernateUtil.Int32, projections);
}
}编写您的QueryOver查询并调用自定义投影:
int count = session.QueryOver<TableA>(() => tableAAlias).Where(p => p.PropertyA.IsLike("%123%")).Left.JoinQueryOver(p => p.TableB, () => tableBAlias).Select( Projections.Count( Projections.Distinct( MyProjections.Checksum( Projections.Property(() => tableAAlias.PropertyA), Projections.Property(() => tableBAlias.PropertyB))))).SingleOrDefault<int>();
这应该生成看起来像您所追求的SQL:
SELECT count(distinct checksum(this_.PropertyA, tableba1_.PropertyB)) as y0_FROM [TableA] this_ left outer join [TableB] tableba1_ on this_.TableBId = tableba1_.IdWHERe this_.PropertyA like '%123%'
1仍在尝试找出是否有一种方法可以在不手动指定参数数量的情况下映射函数



