我正在尝试使用与Query<T>()一起在QueryOver<T>()中使用的计算属性。当使用LINQ查询时,我可以使用自定义DefaultLinqToHqlGeneratorsRegistry注册自定义生成器。这对于从表达式中计算的属性非常有用,所以代码不会被复制。
我似乎找不到为QueryOver API注册自定义生成器的扩展点。它存在吗?
我不想在原始string (Map(x => x.Prop).Formula("query").LazyLoad().Access.ReadOnly())中重复计算的属性逻辑。这意味着两倍的逻辑和两倍的测试次数。
根据我在来源中看到的,QueryOver API使用QueryOver作为它的基础.它直接转换为原始SQL,而不是HQL。
发布于 2013-05-06 11:15:56
Linq和QueryOver采用不同的路径来实现sql:
QueryOver -> Expression -> Criteria \
Linq -> LinqParser -> Hql --> Sql对于标准,有NHibernate.Impl.ExpressionProcessor.RegisterCustomMethodCall(...);,这可能是您想要的。
一个简单的例子:
public static class QueryOverExtensions
{
public static void Register()
{
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Day(default(DateTime)), QueryOverExtensions.ProcessDay);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Month(default(DateTime)), QueryOverExtensions.ProcessMonth);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Year(default(DateTime)), QueryOverExtensions.ProcessYear);
}
public static Int32 Day(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Day);
}
public static Int32 Month(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Month);
}
public static Int32 Year(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Year);
}
private static IProjection ProcessDay(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("day", NHibernateUtil.Int32, property));
}
private static IProjection ProcessMonth(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("month", NHibernateUtil.Int32, property));
}
private static IProjection ProcessYear(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("year", NHibernateUtil.Int32, property));
}
}不要忘了调用注册表()。之后,您可以这样使用它:
session.QueryOver<Order>().Where(o => o.Date.Month() == DateTime.Today.Month).List();发布于 2013-05-15 16:40:33
一个简单的例子:
public static class QueryOverExtensions
{
public static void Register()
{
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Day(default(DateTime)), QueryOverExtensions.ProcessDay);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Month(default(DateTime)), QueryOverExtensions.ProcessMonth);
ExpressionProcessor.RegisterCustomProjection(() => QueryOverExtensions.Year(default(DateTime)), QueryOverExtensions.ProcessYear);
}
public static Int32 Day(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Day);
}
public static Int32 Month(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Month);
}
public static Int32 Year(this DateTime dateTimeProperty)
{
return (dateTimeProperty.Year);
}
private static IProjection ProcessDay(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("day", NHibernateUtil.Int32, property));
}
private static IProjection ProcessMonth(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("month", NHibernateUtil.Int32, property));
}
private static IProjection ProcessYear(MethodCallExpression methodCallExpression)
{
IProjection property = ExpressionProcessor.FindMemberProjection(methodCallExpression.Arguments[0]).AsProjection();
return (Projections.SqlFunction("year", NHibernateUtil.Int32, property));
}
}不要忘了调用注册表()。之后,您可以这样使用它:
session.QueryOver<Order>().Where(o => o.Date.Month() == DateTime.Today.Month).List();https://stackoverflow.com/questions/16318843
复制相似问题