【问题标题】:How does this NHibernate code influence the commit?这个 NHibernate 代码如何影响提交?
【发布时间】:2020-01-31 14:09:09
【问题描述】:

我遇到了以下代码导致异常的问题。

public IList<Persoon> GetPersonenWithCurrentWorkScheme(int clientId)
    {
        //SELECT N+1
        Session.QueryOver<Werkschema>()
            .Fetch(ws => ws.Labels).Eager
            .JoinQueryOver<WerkschemaHistory>(p => p.Histories)
            .JoinQueryOver<ArbeidsContract>(a => a.ArbeidsContract)
            .JoinQueryOver<Persoon>(p => p.Persoon)
            .Where(p => p.Klant.ID == clientId)
            .Future();

        var result = Session.QueryOver<Persoon>()
            .Fetch(p => p.ArbeidsContracten).Eager
            .Where(p => p.Klant.ID == clientId)
            .Future();

        return result.ToList();
    }

当我评论方法的第一部分 (Session.QueryOver WerkSchema...) 时,代码运行良好。当它没有被注释时,第一个出现的NHibernate.Commit() 会抛出一个异常。 (日期时间转换的东西,但这并不是我真正担心的)。

我的问题:第一段代码有用吗?它有什么作用吗?结果没有存储在稍后使用的变量中,所以对我来说它看起来像死代码。或者这是一些 NHibernate 的黑魔法,它实际上做了一些有用的事情?

【问题讨论】:

    标签: c# nhibernate queryover


    【解决方案1】:

    Future 是对 NHibernate 提供的现有 API 的优化。

    NHibernate 2.1 中最好的新特性之一是 Future() 和 FutureValue() 函数。它们本质上用作将查询执行推迟到以后的一种方式,此时 NHibernate 将获得有关应用程序应该做什么的更多信息,并相应地对其进行优化。这建立在 NHibernate 的现有功能 Multi Queries 之上,但以一种易于使用且几乎无缝的方式实现。

    这将在单次往返数据库中执行多个查询。如果单次往返无法获取所有需要的数据,则会按预期执行多次调用;但在很多情况下它仍然有帮助。

    请求第一次往返时触发数据库调用。

    在您的情况下,通过调用result.ToList() 请求第一次往返,其中还包括您的第一部分代码。

    正如您所怀疑的,第一部分的输出;尽管检索到的从未被使用过。所以在我看来,这部分可以安全地评论。但是,这仅基于您发布的相关代码。

    可能是在此调用时加载的数据在代码的其他部分保存往返。但在这种情况下,代码应该被优化并且应该被移动到适当的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2017-04-22
      • 2020-11-29
      • 2023-03-30
      相关资源
      最近更新 更多