C# NHibernate/LINQ选择子查询中的最大值?

C# NHibernate/LINQ选择子查询中的最大值?,c#,linq,nhibernate,C#,Linq,Nhibernate,我一直在尝试获取以下SQL SELECT * FROM dbo.VirtualMachines vm WHERE vm.SequenceId IN ( SELECT MAX(SequenceId) FROM dbo.VirtualMachines GROUP BY RequestId ) AND vm.DeletedBy IS NULL …转换为LINQ查询以与NHibernate一起使用 我已经能够得到一个基于腐蚀子查询的工作变体: var

我一直在尝试获取以下SQL

SELECT * 
    FROM dbo.VirtualMachines vm
    WHERE vm.SequenceId IN (
        SELECT MAX(SequenceId) FROM dbo.VirtualMachines GROUP BY RequestId
    )
    AND vm.DeletedBy IS NULL
…转换为LINQ查询以与NHibernate一起使用

我已经能够得到一个基于腐蚀子查询的工作变体:

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;
…但是,我更愿意使用
MAX()
版本,因为(对SQL Server进行了分析)它是我正在使用的数据集的更高效查询。不幸的是,我不知道如何说服LINQ给我这个查询

我知道我能做到:

from vms in this.currentSession.Query<Entities.VirtualMachine>()
    group vms by vms.RequestId into vmReqs
    select new { 
        LatestSeqId = vmReqs.Max(vms => vms.SequenceId) 
    }
来自此.currentSession.Query()中的VM
按vms.RequestId将VM分组到vmReqs中
选择新{
LatestSeqId=vmReqs.Max(vms=>vms.SequenceId)
}
这给了我子选择(
selectmax(SequenceId)[…])
,但我看不出如何将其与我已经在中执行的
查询相结合。有可能我是以一种过于SQL的思维方式来处理这个问题的,我正试图像在SQL中一样处理查询,还有一些其他的技巧我错过了。

类似这样的东西:

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;
var subquery=来自此.currentSession.Query()中的VM
按vms.RequestId将VM分组到vmReqs中
选择vmReqs.Max(vms=>vms.SequenceId);
var outerQuery=来自此.currentSession.Query()中的vm
其中subQuery.Contains(vm.SequenceId)&&vm.DeletedBy==null;

这似乎完成了任务,尽管SQL有点笨拙(它将子选择包装在一个
存在的文件中(从(…)选择NULL作为t2,其中t2.value=t0.SequenceID
),但它生成的执行计划与仅子查询相同,所以这对我来说已经足够好了。我还注意到(通过实验)“我也可以将它们合并到一个查询中。@ChrisJ对存在的东西有些惊讶……这是什么SQL方言?几乎相同的查询对我不起作用。
System.Int32'不能用作具有类型为'System.Int32'的ItemExpression的序列的数据类型。
。是的。它不适用于NHibernate 5.2.m。”e与上面相同的错误。对于LINQ,需要小心使用“几乎相同的查询”之类的语句。魔鬼和细节等等。@RomanArtiukhin我认为您应该将查询作为一个新问题发布。
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;