0

次の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で行うようにクエリにアプローチしようとしていますが、見逃した他のテクニックがあります。

4

1 に答える 1

1

このようなもの:

var subQuer = from vms in this.currentSession.Query<Entities.VirtualMachine>()
              group vms by vms.RequestId into vmReqs
              select vmReqs.Max(vms => vms.SequenceId);

var outerQuery = from vm in this.currentSession.Query<Entities.VirtualMachine>()
                 where subQuery.Contains(vm.SequenceId) && vm.DeletedBy == null;
于 2013-08-22T09:54:14.570 に答える