C# NHibernate查询超时

C# NHibernate查询超时,c#,database,nhibernate,timeout,C#,Database,Nhibernate,Timeout,我收到以下NHibernate超时异常: could not execute query 内部异常消息为: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 这是失败的NHibernate代码: shareClassReturns = _session.CreateCriteria<ShareClassTra

我收到以下NHibernate超时异常:

could not execute query
内部异常消息为:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
这是失败的NHibernate代码:

shareClassReturns = _session.CreateCriteria<ShareClassTrailingReturn>()
        .Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetAvailableShareClassIds()))
        .Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetShareclassIdsInCalculationGroup(peerGroups, classificationTypes)))
        .Add<ShareClassTrailingReturn>(c => c.CurrencyId == "GBP")
        .AddShareClassReturnOrder(order)
        .CreateCriteria<ShareClassTrailingReturn>(scr => scr.ShareClass, JoinType.InnerJoin)
        .Add(ApplicableIdentifiers(searchExpression))
        .AddShareClassOrder(order)
        .SetMaxResults(pageSize)
        .List<ShareClassTrailingReturn>();
如果我更改NHibernate标准,使其不会对vCalculationGroup执行选择,即如果我删除此行:

.Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetShareclassIdsInCalculationGroup(peerGroups, classificationTypes)))
查询不再超时。这是否意味着我需要用这种观点做点什么?比如索引之类的

有人能建议我如何解决这个问题吗?


编辑:我应该补充一点,查询在SQLServerManagementStudio中运行良好,大约6秒钟后返回。尽管如此,当我查看执行计划时,它报告offline.ShareClassTrailingReturn上缺少索引。这可能是问题所在吗?

如果删除该部分使其工作得更好,我肯定会查看视图上的索引。在应用程序中检查连接超时也是值得的。如果您说ManagementStudio在6秒钟内工作正常,则可能是您的应用程序连接超时时间小于6秒(或者默认值小于6秒)。这将是一个良好的起点


一般来说,避免大量嵌套子查询是值得的。您在生成的SQL中有很多内容。有时,自己编写SQL或HQL比在Criteria或Linq NHibernate API中使用大量复杂连接更有效。您更有可能为工作生成高效的SQL

好建议,谢谢。我们通过执行联接而不是()中的
解决了这个问题
.Add(LambdaSubquery.Property<ShareClassTrailingReturn>(x => x.ShareClass.Id).In(GetShareclassIdsInCalculationGroup(peerGroups, classificationTypes)))
    and this_.SCTR_ShareClassId in 
    (
        SELECT this_0_.ShareClass_Id as y0_
        FROM   dbo.vCalculationGroup this_0_
        WHERE  
            this_0_.PeerGroupId in (1,8)
            and this_0_.ClassificationId in (7,1)
    )