代码之家  ›  专栏  ›  技术社区  ›  Algoman

NHibernate:无法从IronPython调用QueryOver<T>().List()

  •  0
  • Algoman  · 技术社区  · 6 年前

    我正在从事一个使用NHibernate和IronPython的项目。

    因此,我可以从IronPython查询 class Foo 好的当我想要一个所有实例的列表时 福班

    session.QueryOver<Foo>().List()
    

    但当我尝试将其转换为python时,

    session.QueryOver[Foo]().List()
    

    System.MissingMemberException: 'QueryOver[Foo, Foo]' object has no attribute 'List'
    

    起初我认为这是一个默认参数的问题 QueryOver ISession 询问者 -它们都没有默认参数(我仍然尝试传递缺少的.Value,如中所示) Can I use Named and Optional Arguments in ironpython 之前,这没有帮助)

    clr.ImportExtensions 喜欢 https://www.grasshopper3d.com/forum/topics/accessing-my-extension-methods-from-python-component 什么也没做。

    QueryOver[Foo,Foo] 源于 QueryOver[Foo] . 现在看 https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Criterion/QueryOver.cs#L223 QueryOver<Foo> 有办法吗 List() ,但它的定义很奇怪。

    我认为这个方法只是明确地说 列表() 方法,所以我完全不明白这里发生了什么。

    有人能解释一下这个问题吗?我快绝望了。

    1 回复  |  直到 6 年前
        1
  •  0
  •   E_net4 Tunn    6 年前

    我已经弄明白了:

    https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Criterion/QueryOver.cs#L223 是一个显式实现的接口方法。根据 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation

    无论如何-根据 http://www.voidspace.org.uk/ironpython/dark-corners.shtml#interfaces 在python中,需要以不同的方式调用这些方法。您需要显式选择您使用的接口,如下所示:

    IQueryOver[Foo].List(session.QueryOver[Foo]())
    

    在提出问题之前,我自己尝试了几种方法来解决这个问题——为了最终解决这个问题,我必须通过NHibernate源代码,猜测这个定义的作用(因为它非常奇特,而且没有很好的IMHO文档),然后找到如何让python处理它应该能够自己处理的情况。