私はnhibernateの新人であり、あなたの助けが必要です。
nhibernate-criteria C#でこのSQLクエリを実行するにはどうすればよいですか?
select * from
(
select *, row_number() over (partition by questionaireId order by stepnumber desc) rid
from myTable
) t
where t.rid=1
私はnhibernateの新人であり、あなたの助けが必要です。
nhibernate-criteria C#でこのSQLクエリを実行するにはどうすればよいですか?
select * from
(
select *, row_number() over (partition by questionaireId order by stepnumber desc) rid
from myTable
) t
where t.rid=1
まず、小さな注意:Select *
機能しません。すべての列に明示的に名前を付ける必要があります。第二に、あなたが何を達成しようとしているのかわかりません。これが何らかのページングを行う必要がある場合は、より良い提案があります(以下の番号2))。しかし、最初にやりたいことをやろうとしましょう。
1)したがって、列を明示的に選択する必要があることを考慮して、SQL ステートメントを Criteria 構文に変換する方法を次に示します。
var list = session
.CreateCriteria<MyEntity>() // mapped to 'myTable' table
.SetProjection
(
Projections.SqlProjection
(
"Code, Name, row_number() over (partition by questionaireId order by stepnumber desc) as rid"
, new string[] {"Code", "Name"}
, new IType[] { NHibernate.NHibernateUtil.String
, NHibernate.NHibernateUtil.String }
)
)
.SetMaxResults(1) // this is something like t.rid = 1
.SetResultTransformer(Transformers.AliasToBean<MyEntity>())
.List<MyEntity>()
;
マップされたクラスMyEntity
にプロパティがCode
あり、Name
... これは次のように select を実行します:
SELECT TOP 1 Code, Name
, row_number() over (partition by questionaireId order by stepnumber desc) rid
FROM myTable
実行すると、結果はプロパティ (コード、名前) にバインドされ、句によって並べ替えられた最初の行のみが選択されます。
2) ネイティブ NHibernate ページング
あなたが言及したので:私は NHibernate が初めてなので、 Order By プロパティに基づいてページングを取得しようとしていると推測しています。この場合、ソリューションははるかに簡単です。この基準を使用します。
var list = session
.CreateCriteria<MyEntity>()
.AddOrder(new Order("stepnumber", false)) // the property to be used for ORDER BY
.Add(... where conditions ala ICriterion
...
.SetFirstResult(100) // skip 100 rows
.SetMaxResults(20) // take 20 rows
.List<Country>();
私の知る限り、パーティションを作成することはできません。ただし、ビューでクエリを作成し、NHibernate からそのビューを実行することはできます。
名前付きクエリが役立つ場合があります。NHibernate リファレンスを参照してください。