2009-04-11 5 views

Antwort

2

Ich wollte nur damit jeder weiß, wie ich dies mit Code erreicht, die anderen helfen können:

Wenn ich meine Session schaffen, habe ich einfach eine benutzerdefinierte SQL-Funktion zum Objektkonfiguration hinzufügen:

Setup:

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

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

Verbrauch:

Dann in meinen Daten-Provider kann ich anrufen jetzt die benutzerdefinierte Funktion:

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

Sie können native SQL-Abfragen, einschließlich Aggregatfunktionen, in HQL (Hibernate Query Language) verwenden. Siehe Chapter 12 in der Dokumentation.

Bearbeitet um hinzuzufügen: Ich lese es gerade selbst und STDEV wird nicht unterstützt. Eine Alternative, die möglicherweise funktioniert, besteht darin, eine Ansicht zu erstellen, die die Berechnung enthält, und die Ansicht anstelle der Tabelle zuzuordnen. Weiter Googling führt mich zu der Annahme, dass die Dokumentation veraltet sein könnte oder es Erweiterungen zu NHibernate gibt, die STDEV enthalten.

1

Ich bin nicht so vertraut mit NHibernate, aber mit dem Java-Hibernate können Sie leicht einen vorhandenen Dialekt Unterklasse, um zusätzliche Funktionen hinzuzufügen. So etwas wie dies könnte den Trick für Sie (das ist die Java-Version) tun:

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

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

STDEV ist eine native SQL-Funktion für SQL Server ... können Sie gehen durch eine native Abfrage?

0

ich in einem Standard-Weg durch diesen Code gelöst habe:

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

In anderer Art und Weise, die Formel Abrollen die Standardabweichung unter Verwendung der anderen unterstützten Aggregatfunktionen: Summe und Anzahl.

Ich habe mit der Formel 'std()' in mysql überprüft und das funktioniert, außer durch die niedrigstwertigen Stellen (Fehler weniger von 0,000000001D).

Verwandte Themen