首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有像LINQ一样的QueryOver查询生成器或扩展点?

是否有像LINQ一样的QueryOver查询生成器或扩展点?
EN

Stack Overflow用户
提问于 2013-05-01 13:16:54
回答 2查看 516关注 0票数 4

我正在尝试使用与Query<T>()一起在QueryOver<T>()中使用的计算属性。当使用LINQ查询时,我可以使用自定义DefaultLinqToHqlGeneratorsRegistry注册自定义生成器。这对于从表达式中计算的属性非常有用,所以代码不会被复制。

我似乎找不到为QueryOver API注册自定义生成器的扩展点。它存在吗?

我不想在原始string (Map(x => x.Prop).Formula("query").LazyLoad().Access.ReadOnly())中重复计算的属性逻辑。这意味着两倍的逻辑和两倍的测试次数。

根据我在来源中看到的,QueryOver API使用QueryOver作为它的基础.它直接转换为原始SQL,而不是HQL。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-06 11:15:56

Linq和QueryOver采用不同的路径来实现sql:

代码语言:javascript
运行
复制
QueryOver -> Expression -> Criteria \
Linq      -> LinqParser -> Hql      --> Sql

对于标准,有NHibernate.Impl.ExpressionProcessor.RegisterCustomMethodCall(...);,这可能是您想要的。

一个简单的例子:

代码语言:javascript
运行
复制
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));
    }
}

不要忘了调用注册表()。之后,您可以这样使用它:

代码语言:javascript
运行
复制
session.QueryOver<Order>().Where(o => o.Date.Month() == DateTime.Today.Month).List();
票数 3
EN

Stack Overflow用户

发布于 2013-05-15 16:40:33

一个简单的例子:

代码语言:javascript
运行
复制
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));
    }
}

不要忘了调用注册表()。之后,您可以这样使用它:

代码语言:javascript
运行
复制
session.QueryOver<Order>().Where(o => o.Date.Month() == DateTime.Today.Month).List();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16318843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档