是否可以在NHibernate中进行标准偏差?

时间:2009-04-11 15:21:36

标签: nhibernate nhibernate-mapping

是否可以使用NHibernate计算标准偏差?我正在使用Microsoft SQL Server 2005方言。

我在任何地方都找不到任何这样的例子。

请帮忙。

谢谢!

5 个答案:

答案 0 :(得分:2)

只是想让每个人都知道我是如何通过可能帮助他人的代码来实现这一目标的:

当我创建SessionFactory时,我只是将自定义SQL函数添加到配置对象:

<强>设定:

var configuration = new Configuration();
configuration.AddSqlFunction("stdev", new StandardSQLFunction("stdev", HibernateUtil.Double));

SessionFactory = configuration.Configure().BuildSessionFactory();

<强>用法:

然后在我的数据提供者中,我现在可以调用自定义函数:

ICriteria criteria = _session.CreateCriteria(typeof(ItemHistory));
criteria.SetProjection(Projections.SqlFunction("stdev", NHibernateUtil.Double, Projections.Property("Speed") ));
IList results = criteria.List();

答案 1 :(得分:1)

我对NHibernate并不熟悉,但是使用Java Hibernate可以轻松地将现有方言子类化以添加额外的功能。这样的事情可能会对你有所帮助(这是Java版本):

public class MyDialect extends SQLServerDialect
{
    public MyDialect()
    {
        super();

        // register extra functions (may need to specify parameter types)
        registerFunction( "stdev", new StandardSQLFunction( "stdev" ) );
    }
}

答案 2 :(得分:1)

STDEV是SQL Server的本机SQL函数...您可以通过本机查询吗?

答案 3 :(得分:0)

您可以在HQL(Hibernate查询语言)中使用本机SQL查询,包括聚合函数。请参阅文档中的Chapter 12

编辑添加:我自己就读了,不支持STDEV。可能有效的替代方法是创建包含计算的视图,并映射视图而不是表。进一步Googling让我相信文档可能已经过时,或者NHibernate的扩展包括STDEV。

答案 4 :(得分:0)

我已用这个代码以更标准的方式解决了这个问题:

sqrt((sum(value*value)/count(value)) - (avg(value) * avg(value)))

另外,使用支持的其他聚合函数展开标准差的公式:sum和count。

我已经在mysql中检查了公式'std()',除了最低有效数字(误差小于0.000000001D)之外,这是有效的。