NRules:匹配集合

Elg*_*des 2 c# rete nrules

我正在尝试找出 BRE NRules 并得到一些有效的示例,但很难匹配集合。

IEnumerable<Order> orders = null;

When()
    .Match<IEnumerable<Order>>(o => o.Where(c => c.Cancelled).Count() >= 3)
    .Collect<Order>(() => orders, o => o.Cancelled);

Then()
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
Run Code Online (Sandbox Code Playgroud)

基本上我想要的是,如果有 3 个订单被取消,那么执行一些操作。但我似乎无法在集合上获得匹配,单个变量确实有效。

该程序:

var order3 = new Order(123458, customer, 2, 20.0);
var order4 = new Order(123459, customer, 1, 10.0);
var order5 = new Order(123460, customer, 1, 11.0);

order3.Cancelled = true;
order4.Cancelled = true;
order5.Cancelled = true;

session.Insert(order3);
session.Insert(order4);
session.Insert(order5);

session.Fire();
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Ser*_*yev 5

对于 NRules 0.3.1 版本,当您收集 3 个或更多已取消订单时,以下内容将激活规则:

IEnumerable<Order> orders = null;

When()
    .Collect<Order>(() => orders, o => o.Cancelled)
        .Where(x => x.Count() >= 3);
Then()
    .Do(ctx => orders.ToList().ForEach(o => o.DoSomething()));
Run Code Online (Sandbox Code Playgroud)

更新:

对于后代来说,从版本 0.4.x 开始,正确的语法是使用反应式 LINQ。匹配一个集合将如下所示:

IEnumerable<Order> orders = null;
When()
    .Query(() => orders, q => q
        .Match<Order>(o => o.Cancelled)
        .Collect()
        .Where(x => x.Count() >= 3));
Then()
    .Do(ctx => DoSomething(orders));
Run Code Online (Sandbox Code Playgroud)