4

Ich habe eine Frage zu stellen, liebe Gemeinde, wie Sie vielleicht erraten haben. Damit. Ich möchte, dass NHibernate die Ergebnisse einer Abfrage basierend auf der Auswertung der SQL-Funktion mit Tabellenwerten filtert. Mögliche SQL-Abfrage von NHibernate erzeugt wird, kann auf die folgende aussehen:Kann ich Tabellenwertfunktion als Abfragequelle in NHibernate verwenden?

SELECT 
    [whatever] 
FROM 
    [whatever] 
    INNER JOIN dbo.FnMyTableValuedFunction() as MyAlias ON 
     [whatever].FirstDesiredKey = MyAlias.FirstDesiredKey 
     AND 
     [whatever].SecondDesiredKey = MyAlias.SecondDesiredKey 

Oder es kann auf diese Weise geschrieben werden:

SELECT 
    [whatever] 
FROM 
    [whatever] 
WHERE 
    EXISTS(
     SELECT 
      1 
     FROM 
      dbo.FnMyTableValuedFunction() AS MyAlias 
     WHERE 
      [whatever].FirstDesiredKey = MyAlias.FirstDesiredKey 
      AND 
      [whatever].SecondDesiredKey = MyAlias.SecondDesiredKey 
    ) 

Eine solche Abfrage Ich möchte mit Kriterien API erzeugen. Soweit ich weiß, gibt es keine Möglichkeit, NHibernate mitzuteilen, woran es teilnehmen soll und wie. Die einzige mögliche Lösung ist die zweite.
Leider war ich nicht glücklich genug, um herauszufinden, wie Tabellenfunktion als Abfragequelle für korrelierte Unterabfrage zu verwenden. Kannst du mir dabei helfen?

Antwort

0

Alle NHibernate-Abfragemethoden außer SQL (HQL, Kriterien, Linq, QueryOver) arbeiten mit Entitäten, nicht mit Tabellen oder anderen DB-Artefakten. Wenn Sie also Kriterien verwenden, müssen Sie entweder FnMyTableValuedFunction einer Entität zuordnen, oder SQLCriterion für einen beliebigen SQL-Block verwenden.

Mit letzterem, ja, EXISTS ist wahrscheinlich der Weg zu gehen. Sie können einfach die gesamte Bedingung (einschließlich der EXISTS) in ein SQLCriterion einschließen.

0

Sie können möglicherweise eine benutzerdefinierte Methode in eine abgeleitete SQLDialect hinzufügen, und verwenden Sie diese in einem Kriterium, in RegisterFunction in NHibernate.Dialect.Dialect suchen, die alle Dialekte erbt.