7

そのため、過去数時間答えを探していましたが、意味のあるものは何も見つからないようです。

public class Game
{
   public virtual Guid ID { get; set; }
   public virtual ResultStructure Structure { get; set; }
   public virtual List<Result> Results { get; set; }
}

public class Result
{
  public virtual Player Player { get; set; }
  public virtual int Position { get; set; }
}

public class ResultStructure
{
  public virtual Guid ID { get; set; }
  public virtual List<ResultOutcomes> Outcomes { get; set;}
}

public class ResultOutcomes
{
  public virtual int Position { get; set; }
  public virtual int Points { get; set; }
}

public class PlayerSummary
{
  public virtual Player Player { get; set; }
  public virtual int Points { get; set; }
}

私がやろうとしているのは、プレーヤーのリストと、多数の異なるゲームで獲得したポイントを取得することです (gameゲームのリストを含む上記の複数のエンティティがあります)。したがって、クエリの最終結果は次のList<PlayerSummary> ようになります。探している SQL は次のようになります。

SELECT p.*, Sum(rs.points) FROM result r
  JOIN player p on r.playerid = p.id
  JOIN game g on r.gameid = g.id
  JOIN resultstructure rs on g.resultstructureid = rs.id
  JOIN resultoutcomes ro on rs.id = ro.resultstructureid AND ro.position = r.position

また、構造エンティティに対してクエリ/合計を行う必要があることに注意してください。これが含まれている理由です。

TypeSafe を使用して NHibernate でこれを実行しようとしていますが、アプリケーションをデータベースに依存しないようにする計画があるため、直接 SQL を使用することはできません (現在は Postgres を使用していますが、SQL サーバーに移行する可能性があります)。点)。

これらの魔法の文字列を使用する「HQL」のものを特に使用したくないので、Linq または QueryOver/Query を使用しようとしています。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

6

私の状況では、関係があるので上記が可能であるように思われますが、それは直接的なものではありません。

を使用できますJoinAlias

基本的な違いは、を使用するJoinAliasと、複数のテーブルを同じベーステーブルに結合できることですJoinQueryOver。これと同様に、各テーブルを前のテーブルにのみ結合するテーブルを直線的に進めます。

したがって、クエリは次のようになります。

Result resultAlias = null;
ResultOutcome outcomeAlias = null;
ResultStructure structureAlias = null;

var results = Session.QueryOver(() => resultAlias) // Assigns resultAlias so it can be used further in the query.
   .Inner.JoinQueryOver(x => x.Game) // returns a QueryOver Game so you can do a where on the game object, or join further up the chain.
   .Inner.JoinAlias(x => x.ResultStructure, () => structureAlias) // joins on the Structure table but returns the QueryOver for the Game, not the structure.
   .Inner.JoinAlias(() => structureAlias.Outcomes, () => outcomeAlias) // same again for the outcomes
   .Where(() => resultAlias.Position == outcomeAlias.Position)
   .Select(
        Projections.Group(() => resultAlias.Player),
        Projections.Sum(() => outcomeAlias.Points)
   );

それは人々にアイデアを与えるはずです。これの欠点は、「位置」の制限が結合ではなく、Where句で発生することです。データベースクエリプランナーを特定のルートに強制するので、それを行うオプションを持っている人から聞いてうれしいです。

まだ変換と順序付けに取り組んでいますが、それは私をさらに前進させました。

于 2013-02-14T18:21:18.897 に答える