1

複雑な合計を選択します。だから私は、このようなSQLを実行したい:NHibernateのは、私は実体を持って

QueryOver.Of<Entity>().Select(Projections.SqlProjection("SUM(A-B-C) AS total", new[] { "total" }, new IType[] { NHibernateUtil.Int32 })); 

しかし、私は、文字列を使用したくない:

SELECT SUM(A-B-C) FROM Entity 

私はSqlProjectionことによってそれを達成することができます。どのように他の方法で行うことができますか?

答えて

2

残念ながら、NHibernateには算術演算子が組み込まれていません。 this question and answerにピギーバック、ここではいくつかのオプションは次のとおりです。

  1. 使用VarArgsSQLFunctionが直接:

    var subtractFunction = new VarArgsSQLFunction(string.Empty, " - ", string.Empty); 
    
    session.QueryOver<Entity>(() => entityAlias) 
        .Select(
         Projections.Sum(
          Projections.SqlFunction(
           subtractFunction, NHibernateUtil.Int32, 
            Projections.Property(() => entityAlias.A), 
            Projections.Property(() => entityAlias.B), 
            Projections.Property(() => entityAlias.C) 
          ) 
         ) 
        ) 
        .SingleOrDefault<int?>() 
    

    これは、これを実現する最も簡単な方法ですが、それをドレスアップするには、いくつかの方法があります。

  2. は、独自の方言を作成し、-関数を登録:

    public class MyDialect : MsSql2008Dialect 
    { 
        public MyDialect() 
        { 
         this.RegisterFunction("-", new VarArgsSQLFunction(string.Empty, " - ", string.Empty)); 
        } 
    } 
    
    session.QueryOver<Entity>(() => entityAlias) 
        .Select(
         Projections.Sum(
          Projections.SqlFunction(
           "-", NHibernateUtil.Int32, 
            Projections.Property(() => entityAlias.A), 
            Projections.Property(() => entityAlias.B), 
            Projections.Property(() => entityAlias.C) 
          ) 
         ) 
        ) 
        .SingleOrDefault<int?>() 
    

    これは基本的に、あなたは-機能にあなたがそれを使用するたびに再定義を回避することを可能にし、少しクリーナーです。これらのすべては、以下のSQLを生成

    public static class CustomProjections 
    { 
        public static IProjection Subtract(IType type, params IProjection[] projections) 
        { 
         return Projections.SqlFunction("-", type, projections); 
        } 
    } 
    
    session.QueryOver<Entity>(() => entityAlias) 
        .Select(
         Projections.Sum(
          CustomProjections.Subtract(
           NHibernateUtil.Int32, 
           Projections.Property(() => entityAlias.A), 
           Projections.Property(() => entityAlias.B), 
           Projections.Property(() => entityAlias.C) 
          ) 
         ) 
        ) 
        .SingleOrDefault<int?>() 
    

SELECT 
    sum(this_.A - this_.B - this_.C) as y0_ 
FROM 
    Entity this_ 
+0

はありがとう

  • あなたも、さらに行くと拡張メソッドへの投影をリファクタリングすることができます。あなたのソリューションは私の場合に適しています。しかし、私は、異なる演算子(例えばSUM(A-B + C))との和を扱う方法がないと思います。クエリー().Sum(x => x.A + x.B + x.C) 'が機能するので、それは奇妙です。残念ながら、私はQueryOverを使用しなければなりません –

  • +0

    まあ、あなたは '+'演算子を定義し、それを '-'の呼び出しでネストすることができます。しかし、ええ、理想的ではありません。 –

    関連する問題