0

次のSQLクエリをnHiberateQueryOverステートメントに入れようとしていますが、惨めに失敗しています。

Select top 15 percent
    People.personId
,People.Name
    ,SUM(Marks.Score)
from 
    People
    inner join [sessions] on [sessions].PersonId = People.PersonId
    inner join Marks on Marks.SessionId = [Sessions].SessionId
group by
    People.Name
    ,People.PersonId
order by
    SUM(Marks.Score) asc

私のオブジェクトは次のとおりです。

  • セッション
  • マーク

明らかなFK制約(人->セッション->マーク)。

誰かが私にアドバイスをくれませんか?

どうもありがとう

4

2 に答える 2

4

結合はで十分簡単.Join()です。マッピングでこれらの関係を定義している場合は、結合の方法を指定する必要もありません。
私は通常、を使用する方が便利だと思いますJoinAlias。集計はを使用して行われProjectionsます(エイリアスとプロジェクションはこちらをご覧ください)。

もちろん、単純な合計予測とグループ化予測が必要になります。

結果として、を使用しobject []てキャストするか(上記のリンクのように)、カスタムDTOを定義してを使用することができますAliasToBeanResultTransformer。(これはかなり古いブログ投稿です。ラムダ式を使用できるように構文が変更されました)。

上位15%について-よくわかりません。
QueryOver().Take()定数を可能にします。パーセンテージのネイティブサポートがあるかどうかはわかりません。
ただし、独自のプロジェクションを実装することもできます。ここを参照してください。

編集:簡単な投影例
私はどれほど怠惰になることができますか?これをgithubからコピーしました。
結合、エイリアス、プロジェクションなど、必要なものがすべて揃っています。楽しみのためにSUMプロジェクションを追加しました。
もちろん、他のすべてのプロパティをグループ化する必要があることに注意してください。

Customer customer = null;
    Employee employee = null;
    OrderHeader orderHeader = null;

    var orderHeaders = Session.QueryOver<Order>()
        .JoinAlias(o => o.Customer, () => customer)
        .JoinAlias(o => o.Employee, () => employee)
        .SelectList(list => list
            .SelectGroup(o => o.OrderedOn).WithAlias(() => orderHeader.OrderedOn)
            .SelectGroup(o => customer.Name).WithAlias(() => orderHeader.Name)
            .SelectGroup(o => employee.FirstName).WithAlias(() => orderHeader.FirstName)
            .SelectGroup(o => employee.LastName).WithAlias(() => orderHeader.LastName)
            .SelectSum(o => employee.Salary).WithAlias(() => orderHeader.JhonnysProjectionExample))
        .TransformUsing(Transformers.AliasToBean<OrderHeader>())
        .List<OrderHeader>();
于 2012-08-17T14:26:49.280 に答える
0

TOP n PERCENT非標準のSQL構造です(非常に便利なものです。追加するかもしれません)

NHクエリメソッドではこれはサポートされていません。SQLとして保持してください。

于 2012-08-17T14:25:02.717 に答える