如何将本机SQL查询结果映射到NHibernate中的自定义值类型列表?

时间:2014-03-12 13:53:15

标签: c# sql nhibernate native-sql iusertype

我有一个名为FiscalYear的值类型,它实质上是一个整数的包装器。我也为它实现了NHibernate.UserTypes.IUserType。现在我可以将类型FiscalYear的属性直接映射到SQL类型,NHibernate会自动转换它们。

一切正常。但是现在我想执行本机SQL查询以从数据库中获取会计年度列表。这是当前的代码:

public IEnumerable<FiscalYear> FiscalYears
{
    get
    {
        var result = new List<FiscalYear>();
        foreach (var fiscalYear in Session.CreateSQLQuery(FiscalYearsQuery).List<Int16>())
        {
            result.Add(new FiscalYear(fiscalYear));
        }
        return result;
    }
}

是否有效,但我的问题是:由于我已经为IUserType实现了FiscalYear,是否可以将此代码简化为以下内容:

public IEnumerable<FiscalYear> FiscalYears
{
    get
    {
        return Session
            .CreateSQLQuery(FiscalYearsQuery)
            .List<FiscalYear>();
    }
}

不幸的是,这不起作用。使用Transformers.AliasToBean也无济于事,因为FiscalYear是值类型而不是实体。

我认为这真的很容易做到,但到目前为止我的所有尝试都失败了。我想我只是遗漏了一些东西?

2 个答案:

答案 0 :(得分:0)

使用CreateSQLQuery时必须添加返回值的类型,我从未使用自定义类型的本机SQL查询,但您可以尝试:

return Session
    .CreateSQLQuery(FiscalYearsQuery)
    .AddScalar("*QueryColumnName*", FiscalYear)
    .List<FiscalYear>();

如果这不起作用,您可以实施IResultTransformer以更优雅的方式转换数据。

答案 1 :(得分:0)

看一下这篇文章:

NHibernateUtil.Custom()

有描述,你可以使用NHibernateUtil.Custom(IUserType)