次のSQLを取得しようとしています
SELECT *
FROM dbo.VirtualMachines vm
WHERE vm.SequenceId IN (
SELECT MAX(SequenceId) FROM dbo.VirtualMachines GROUP BY RequestId
)
AND vm.DeletedBy IS NULL
...NHibernate で使用するための LINQ クエリに変換します。
相関サブクエリに基づく、この動作のバリエーションを得ることができました。
var allvms = from vms in this.currentSession.Query<Entities.VirtualMachine>()
where vms.DeletedBy == null
where vms.Id == (
from activeVms in this.currentSession.Query<Entities.VirtualMachine>()
where activeVms.RequestId == vms.RequestId
orderby activeVms.Id descending
select activeVms.Id).First()
orderby vms.RequestId
select vms;
...それは私に...
SELECT *
FROM dbo.VirtualMachines vm
WHERE vm.SequenceId IN (
SELECT TOP 1 zvm.SequenceId From dbo.VirtualMachines zvm WHERE zvm.RequestId = vm.RequestId ORDER BY zvm.SequenceId DESC
)
AND vm.DeletedBy IS NULL
...しかし、(プロファイルされた SQL Server を使用して) バージョンを使用したいのですが、使用MAX()
しているデータセットのより効率的なクエリです。残念ながら、LINQ をラングリングしてクエリを取得する方法がわかりません。
私はできることを知っています:
from vms in this.currentSession.Query<Entities.VirtualMachine>()
group vms by vms.RequestId into vmReqs
select new {
LatestSeqId = vmReqs.Max(vms => vms.SequenceId)
}
これにより、サブ選択 ( SELECT MAX(SequenceId) [...]
) が得られますが、これを、既に実行しなければならないクエリと組み合わせる方法がわかりませんIN
。SQLの考え方でこれに取り組んでいる可能性があります.SQLで行うようにクエリにアプローチしようとしていますが、見逃した他のテクニックがあります。