如何为NHibernate LINQ语句设置超时

Bra*_*zel 13 linq-to-nhibernate c#-4.0

我正在使用Fluent NHibernate进行ORM.在这样做的过程中,我尝试使用NHibernate LINQ语法以LINQ的强大功能获取一组数据.我已经正常工作并执行的代码,例外情况是,如果运行时间超过大约30秒,则会引发超时.我的问题是如何通过NHibernate扩展LINQ语句的默认30秒超时?

我已经在这里,这里这里看过帖子,但前两个是指设置DataContext的Timeout属性,这里不适用,第三个是指用XML设置超时,这也不适用因为我正在使用流畅的NHibernate可以动态生成XML.不仅如此,这篇文章还有2年历史,而Fluent NHibernate自此改变了.

使用ICriteria对象甚至是HQL,我可以指定超时,但这不是目标.我想知道如何设置相同的超时并使用LINQ.

示例代码:

    using (var session = SessionFactory.OpenSession())
    using (var transaction = session.BeginTransaction())
    {
        var query = (from mem in session.Query<Member>()
                     select mem);
        query = query.Where({where statement});
        int start = (currentPage - 1) * max);
        if (start > 0)
            query = query.Skip(start).Take(max);
        else
            query = query.Take(max);

        var list = query.ToList();
        transaction.Commit();
        return list;
    }
Run Code Online (Sandbox Code Playgroud)

此代码(where语句无关紧要)适用于所有目的,除非发生超时.

任何帮助表示赞赏.提前致谢!

Bra*_*zel 13

我最终为Configuration for Fluent NHibernate设置了命令超时.这样做的缺点是它设置了所有数据访问调用的超时而不仅仅是一个.

示例代码:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString()))
Run Code Online (Sandbox Code Playgroud)

我从这个网站上找到了这个建议.

  • 在设置NHibernate属性时,应该使用NHibernate.Cfg.Environment命名空间.这样,如果密钥更改,您就不会更换文本.对于命令超时,您可以按照Brandon的建议执行以下操作,但使用常量:`.ExposeConfiguration(c => c.SetProperty(NHibernate.Cfg.Environment.CommandTimeout,TimeSpan.FromMinutes(5).TotalSeconds.ToString())` (6认同)

Kin*_*n2k 8

Nhibernate扩展了IQueryable并添加了一些方法https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Linq/LinqExtensionMethods.cs

var query = (from c in Session.Query<Puppy>()).Timeout(12);
Run Code Online (Sandbox Code Playgroud)

要么

var query = (from c in Session.Query<Puppy>());

query.Timeout(456);
Run Code Online (Sandbox Code Playgroud)