1

我尝试使用Between谓词将当前日期时间与日期时间范围进行比较。

我引用mscorlib程序集并在程序集中的类中使用get_Now()DateTime获取 DateTimeNow。我无法将此当前日期时间与范围进行比较。

我的情况是这样的:

  • DateTimeNow 介于 2012-08-03 07:00:00 和 2012-08-04 07:00:00 之间

  • 我所在地区的 DateTimeNow 应该是2012-08-03 16:33:20这一刻。它应该在我指定的范围内。但它似乎不起作用。如果我用 替换DateTimeNow2012-08-03 16:33:20它可以工作。

似乎由于某种原因我的DateTimeNow不起作用。有人有什么想法吗?

4

2 回答 2

2

我发现在 .net mscorlib 程序集中使用 Get_Date() 函数,你必须修改你的机器注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\BusinessRules\3.0\StaticSupport (DWORD),赋值 1

详情在:

http://blogs.msdn.com/b/richardbpi/archive/2005/11/14/492489.aspx

http://kinnaribhute.blogspot.co.nz/2008/04/some-interesting-stuff-about-biztalk.html

我不确定这将如何影响生产服务器,如果生产服务器环境没有与多个节点集群,则重新启动服务器会中断。

于 2012-08-05T23:47:22.400 回答
0

在引擎中对事实进行逻辑建模的方式与在 .NET 代码中对对象进行建模的方式之间存在阻抗不匹配,其影响之一是调用静态方法的问题。如果按照肖寒的描述设置 StaticSupport 标志,引擎会改变其行为,将静态方法视为内置函数或谓词。然而,默认情况下,引擎将静态方法视为事实的行为。从物理上讲,事实是引擎工作内存中的一个对象,每个事实都必须在引擎使用它的方法之前被断言。因此,要在 DateTime 上调用静态 Now 属性 getter,您首先必须向引擎断言 DateTime 对象。当然,DateTime 是一个值类型(结构),但这没关系,因为当您执行规则集时,您将单个事实断言为 Object 或将一组事实断言为 Object 数组。.NET 将自动装箱以这种方式传递的 DateTime(在内部将其包装为对象)。

我意识到,为了调用该对象的类型的静态方法(或者,在这种情况下,属性 getter,当然它实际上是一种方法),必须向引擎声明一个对象,这似乎很疯狂。如果引擎被构建为默认将静态方法视为内置方法,那可能会更好。然而,事实并非如此。此外,如果微软在单个规则集甚至单个规则的级别实现了 StaticSupport 标志会更好。在注册表中实现它(机器级别),或者以这种方式在 .config 文件(应用程序级别;使用)中配置它可能会带来真正的问题,因为它可能会破坏为使用相反值而编写的规则集旗帜。

要记住的另一点是静态支撑也可以设置为“2”。在这种情况下,如果您调用不带参数的静态方法,或者仅使用常量值调用它,并且如果您将其作为条件中的谓词或作为另一个函数的参数调用,那么引擎将评估静态成员一次并缓存结果。

于 2012-11-09T00:19:20.307 回答