NH 3.3とLoquacious構成を使用している場合は、次のようなことができます。
を構成に追加しLinqToHqlGeneratorsRegistry
ます:-
var configure = new Configuration()
.DataBaseIntegration(x => {
x.Dialect<CustomDialect>();
x.ConnectionStringName = "db";
})
.LinqToHqlGeneratorsRegistry<MyLinqtoHqlGeneratorsRegistry()
.CurrentSessionContext<WebSessionContext>();
次の3つのクラスを追加します。-
public class MyLinqtoHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public MyLinqtoHqlGeneratorsRegistry()
{
this.Merge(new AddHoursGenerator());
}
}
public class AddHoursGenerator : BaseHqlGeneratorForMethod
{
public AddHoursGenerator()
{
SupportedMethods = new[] {
ReflectionHelper.GetMethodDefinition<DateTime?>(d =>
d.Value.AddHours((double)0))
};
}
public override HqlTreeNode BuildHql(MethodInfo method,
System.Linq.Expressions.Expression targetObject,
ReadOnlyCollection<System.Linq.Expressions.Expression> arguments,
HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.MethodCall("AddHours",
visitor.Visit(targetObject).AsExpression(),
visitor.Visit(arguments[0]).AsExpression()
);
}
}
public class CustomDialect : MsSql2008Dialect
{
public CustomDialect()
{
RegisterFunction(
"AddHours",
new SQLFunctionTemplate(
NHibernateUtil.DateTime,
"dateadd(hh,?2,?1)"
)
);
}
}
私はこれをfabioによるこのブログ投稿に基づいています。
これで、コードをそのまま使用できます。-
Session.Query<Item>.Where( x => x.Start.AddHours( 3 ) > x.Finish );
これは3.2でも可能ですが、public override HqlTreeNode BuildHql(..)
パラメーターは少し異なります...